我必须根据文章描述中的关键字(字符串)过滤文章数组。在1500种元素的Article类型数组和每个文章描述中2000多个单词的过滤过程中,需要2-3秒的时间。
我正在使用以下代码;我也尝试过谓词,但没有为我工作。
let searchResult = articlesList.filter {
let article = $0
let filterByName = article.title.lowercased().range(of: text.lowercased())
let filterByDescription = article.body.lowercased().range(of: (text.lowercased()))
if ((filterByName != nil) || filterByDescription != nil) {
if !articlesList.contains(article) {
articlesList.append(article)
}
}
else {
let index = articlesList.index(of: article)
if index != nil {
articlesList.remove(at: index!)
}
}
return false
}
我希望过滤时间最长不超过0.3秒。
答案 0 :(得分:3)
这可能快了许多
let searchResult = articles.filter{ $0.title.range(of: text, options: .caseInsensitive) != nil
|| $0.body.range(of: text, options: .caseInsensitive) != nil }
答案 1 :(得分:1)
问题是您对要过滤的集合执行更改。过滤器功能中不应包含articleList.remove()
和articleList.append()
。 filter
的工作方式是,对于要保留在过滤后的集合中的每个元素(在您的情况下为true
)中,您只返回searchResult
,对于其余元素,则返回false
。
尝试此代码:
let searchResult = articlesList.filter { article in
let filterByName = article.title!.lowercased().range(of: text.lowercased())
let filterByDescription = article.body!.lowercased().range(of: (text.lowercased()))
if ((filterByName != nil) || filterByDescription != nil){
return true
}
return false
}