我正在为我的应用创建一个搜索栏.我正在使用该filter方法来获得结果.我想搜索多个键.
字典数组:
var people = [
["First": "John", "Last": "Doe"],
["First": "Steve", "Last": "Jobs"],
["First": "Elon", "Last": "Musk"]
]
Run Code Online (Sandbox Code Playgroud)
我只能使用以下代码搜索"First"或"Last",但不能同时搜索两者:
searchResults = people.filter{
var string = $0["Last"]
// or "First"
string = string?.lowercaseString
return string!.rangeOfString(searchText.lowercaseString) != nil
}
Run Code Online (Sandbox Code Playgroud)
一种方法是简单地将两个字段与搜索字符串进行比较:
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
}
Run Code Online (Sandbox Code Playgroud)
这给了我这个结果:
2015-11-18 18:19:47.691 MyPlayground[36558:7031733] (
{
First = JohnMusk;
Last = Doe;
},
{
First = Elon;
Last = Musk;
}
)
Run Code Online (Sandbox Code Playgroud)
我认为这就是你想要的.
这是另一种使用方法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
Run Code Online (Sandbox Code Playgroud)
在我的示例中,我传递了不同的搜索查询,以查找名字和姓氏,但您显然可以为两者传递相同的查询.只是展示了这种方法的力量.
| 归档时间: |
|
| 查看次数: |
5794 次 |
| 最近记录: |