Ios 多字典键的Swift过滤器
我正在为我的应用程序制作一个搜索栏。我正在使用Ios 多字典键的Swift过滤器,ios,swift,filter,Ios,Swift,Filter,我正在为我的应用程序制作一个搜索栏。我正在使用filter方法来获得结果。我想搜索多个键 字典数组: var people = [ ["First": "John", "Last": "Doe"], ["First": "Steve", "Last": "Jobs"], ["First": "Elon", "Last": "Musk"] ] 我只能使用以下代码搜索“第一个”或“最
filter
方法来获得结果。我想搜索多个键
字典数组:
var people = [
["First": "John", "Last": "Doe"],
["First": "Steve", "Last": "Jobs"],
["First": "Elon", "Last": "Musk"]
]
我只能使用以下代码搜索“第一个”或“最后一个”,但不能同时搜索两个:
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;
}
)
我相信这就是你想要的 下面的代码应该有效:
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
}
这里有一种使用
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
在我的示例中,我为名字和姓氏传入了不同的搜索查询,但是您显然可以为这两个名字传入相同的查询。仅演示此方法的威力。这是您正在使用的真实代码吗?在你的字典数组的第二行,你缺少了一个
“
,在Steve
之后。我正在使用的字典非常大,所以我做了一个小的作为例子,但搜索的代码就是我正在使用的。