在给定字符串的数组中查找匹配?

时间:2016-06-15 17:34:59

标签: ios iphone arrays swift

好的,我可以说我有一个自定义对象,用于词汇单词,替代写作方式及其含义。

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对象中找到了下さい。这是索引号。”

1 个答案:

答案 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)