有没有更快的方法来查找字符串中以字符串开头的单词?

Is there a faster method to find words beginning with string inside a string?

我在 Core Data 上有一个名为 keywords 的字段,用于存储由空格分隔的关键字,例如:

car nascar race daytona crash 

我有一个由核心数据填充的列表。该列表中的每个元素都有关键字。

我在该视图上有一个搜索字段。

我希望在用户输入时过滤该列表。

如果用户键入 c,应用程序将检查关键字以 c 开头的元素。在这种情况下,上面提到的元素将被显示,因为它有 carcrash,两者都以 c.

开头

为了检查这一点,我创建了这个扩展程序

extension String {

  func containsWordStartingWith(insensitive searchWord: String) -> Bool {
    let lowercaseSelf = self.lowercased().trimmingCharacters(in: .whitespaces)
    let lowercaseSearch = searchWord.lowercased().trimmingCharacters(in: .whitespaces)
    
    let array = lowercaseSelf.components(separatedBy: " ")
    return array.contains(where: {[=11=].hasPrefix(lowercaseSearch)})
  }
}

这可行,但速度非常慢,而且在搜索栏上键入字符会使应用停止运行。

我怎样才能更快地改进它?

我要做的第一件事是将单个关键字字符串拆分为一组实际关键字。如果可能的话,您甚至应该以这种方式将其存储在核心数据中,因此不需要拆分步骤。

let keywords = "car nascar race daytona crash"
let keywordSet = Set(keywords.split(separator: " "))

现在你想要的实用方法是简单而快速的:

func keywordSet(_ set : Set<Substring>, containsWordStartingWith s: Substring) -> Bool {
    for keyword in set {
        if keyword.hasPrefix(s) { return true }
    }
    return false
}

测试:

keywordSet(keywordSet, containsWordStartingWith:"c")