作为对@appzYourLife 解决方案的改进,您可以使用本机 Swift 执行此操作Set
,因为在这种情况下不一定需要计数集。这将省去map(_:)
每个名字的字符并将它们桥接到Objective-C。您现在可以只使用一组Character
s,因为它们是Hashable
.
例如:
struct Candy {
let name: String
}
let candies = [Candy(name: "CRAB"), Candy(name: "DUNGINESS"), Candy(name: "RAW")]
var filteredCandies = [Candy]()
func filterContentForSearchText(searchText: String) {
let searchCharacters = Set(searchText.lowercaseString.characters)
filteredCandies = candies.filter {Set($0.name.lowercaseString.characters).isSupersetOf(searchCharacters)}
tableView.reloadData()
}
filterContentForSearchText("RA")
print(filteredCandies) // [Candy(name: "CRAB"), Candy(name: "RAW")]
filterContentForSearchText("ED")
print(filteredCandies) // Candy(name: "DUNGINESS")]
还取决于您是否可以将其识别为性能瓶颈(您应该先进行一些分析) - 您可以通过缓存包含“糖果”名称字符的集合来进一步优化上述内容,从而不必在每个地方重新创建它们搜索(尽管如果您更新candies
数据,您必须确保它们已更新)。
当你来搜索的时候,你可以使用zip(_:_:)
andflatMap(_:)
来过滤掉对应的糖果。
let candies = [Candy(name: "CRAB"), Candy(name: "DUNGINESS"), Candy(name: "RAW")]
// cached sets of (lowercased) candy name characters
let candyNameCharacterSets = candies.map {Set($0.name.lowercaseString.characters)}
var filteredCandies = [Candy]()
func filterContentForSearchText(searchText: String) {
let searchCharacters = Set(searchText.lowercaseString.characters)
filteredCandies = zip(candyNameCharacterSets, candies).flatMap {$0.isSupersetOf(searchCharacters) ? $1 : nil}
tableView.reloadData()
}