[英]Swift filter for multiple dictionary keys
我正在為我的應用創建一個搜索欄。 我正在使用filter
方法來獲得結果。 我想搜索多個鍵。
字典數組:
var people = [
["First": "John", "Last": "Doe"],
["First": "Steve", "Last": "Jobs"],
["First": "Elon", "Last": "Musk"]
]
我只能使用以下代碼搜索“First”或“Last”,但不能同時搜索兩者:
searchResults = people.filter{
var string = $0["Last"]
// or "First"
string = string?.lowercaseString
return string!.rangeOfString(searchText.lowercaseString) != nil
}
一種方法是簡單地將兩個字段與搜索字符串進行比較:
var people = [
["First": "JohnMusk", "Last": "Doe"],
["First": "Steve", "Last": "Jobs"],
["First": "Elon", "Last": "Musk"]
]
var searchText = "Musk"
var searchResults = people.filter{
var firstName = $0["First"]!.lowercaseString
var lastName = $0["Last"]!.lowercaseString
return firstName.rangeOfString(searchText.lowercaseString) != nil
|| lastName.rangeOfString(searchText.lowercaseString) != nil
}
這給了我這個結果:
2015-11-18 18:19:47.691 MyPlayground[36558:7031733] (
{
First = JohnMusk;
Last = Doe;
},
{
First = Elon;
Last = Musk;
}
)
我認為這就是你想要的。
這是使用NSPredicate
的替代方法。 NSPredicate
有一個非常強大的語法 ,可以為你做一些非常好的事情。
let firstNameQuery = "jo"
let lastNameQuery = "mus"
// [cd] means case/diacritic insensitive. %K is used to pass in key names since FIRST and LAST are reserved keywords in NSPredicate
let predicate = NSPredicate(format: "%K CONTAINS[cd] %@ OR %K CONTAINS[cd] %@", "First", firstNameQuery, "Last", lastNameQuery)
let sorted = people.filter({
return predicate.evaluateWithObject($0)
})
// sorted would contain John Doe and Elon Musk entries
在我的例子中,我傳遞了不同的搜索查詢,以查找名字和姓氏,但顯然你可以為兩者傳遞相同的查詢。 只是展示了這種方法的力量。
以下代碼應該有效:
var people = [
["First": "John", "Last": "Doe"],
["First": "Steve", "Last": "Jobs"],
["First": "Elon", "Last": "Musk"]
]
let searchResults = people.filter{
var found = false
let searText = "Elon"
for str in $0.values {
found = str.lowercaseString.rangeOfString(searText.lowercaseString) != nil
if found {
break
}
}
return found
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.