好的,我可以说我有一个自定义对象,用于词汇单词,替代写作方式及其含义。
class VocabEntry {
var kanji:String?
var kana:String?
var meaning:String?
}
然后我有一个由这些对象组成的数组。这是一个例子。
let newVocabWord = VocabEntry()
newVocabWord.kanji = "下さい”
newVocabWord.kana = "ください”
newVocabWord.meaning = "please"
现在我有一串文字:
let testString = "すみません、十階のボタンを押して下さい"
如何将该字符串与我的自定义对象数组(包含字符串)进行比较并引用匹配项?
我试过了。
if vocabArray.contains( { $0.kanji == testString }) {
print("yes")
}
但是试图匹配整个字符串。如果我将testString
更改为“下さい”,它可以正常工作,但这不是我想要的。我想要的是它说“我在xx对象中找到了下さい。这是索引号。”
答案 0 :(得分:1)
您可以将indexOf()
与谓词一起使用来查找a的索引
匹配条目,containsString()
搜索子字符串。
由于kanji
属性是可选的,因此您必须检查via
可选绑定:
if let index = vocabArray.indexOf({ entry in
if let kanji = entry.kanji {
// check if `testString` contains `kanji`:
return testString.containsString(kanji)
} else {
// `entry.kanji` is `nil`: no match
return false
}
}) {
print("Found at index:", index)
} else {
print("Not found")
}
这可以写成更简洁的
if let index = vocabArray.indexOf({
$0.kanji.flatMap { testString.containsString($0) } ?? false
}) {
print("Found at index:", index)
} else {
print("Not found")
}
要获取所有匹配条目的索引,以下内容将起作用:
let matchingIndices = vocabArray.enumerate().filter { (idx, entry) in
// filter matching entries
entry.kanji.flatMap { testString.containsString($0) } ?? false
}.map {
// reduce to index
(idx, entry) in idx
}
print("Found at indices:", matchingIndices)