使用 Swift 根据搜索文本搜索数组
Search an array based on search text using Swift
我是 swift 的新手,我有一个新项目。我正在尝试做一个搜索功能。我有一个字典数组,包含 firstName 和 lastName 作为键,我需要根据包含搜索字符串
的 firstName 过滤掉人
let nameList : [Dictionary<String,String>] =
[["firstName" : "John Sam","lastName" : "Smith"],
["firstName" : "Johnny","lastName" : "Smith"],
["firstName" : "Albert","lastName" : "Smith"],
["firstName" : "Alby","lastName" : "Wright"],
["firstName" : "Smith","lastName" : "Green"]]
与 objective C 一样,我可以轻松地使用
[NSPredicate predicatewithformat:"firstName contains[c] %@",searchText]
我也知道可以在 Swift 上完成相同的谓词。但我正在寻找等效的 Swift,以便我可以了解如何使用映射和过滤器。任何帮助表示赞赏
请尝试以下方式。
我已经通过了 constant value
你需要在 someString variable
的地方通过你的 dynamic value
。
let someString = "Alby"
var arr:NSArray =
[["firstName" : "John Sam","lastName" : "Smith"],
["firstName" : "Johnny","lastName" : "Smith"],
["firstName" : "Albert","lastName" : "Smith"],
["firstName" : "Alby","lastName" : "Wright"],
["firstName" : "Smith","lastName" : "Green"]]
var pre:NSPredicate = NSPredicate(format: "firstName CONTAINS[c] %@", someString)!
var result:NSArray = arr.filteredArrayUsingPredicate(pre)
print(result)
试试,
let searchText = "John Sam"
func isMatch (nameDictionary: Dictionary<String, String>) -> Bool {
if(nameDictionary["firstName"] == searchText) {
return true
}
else {
return false
}
}
let results = nameList.filter(isMatch)
您可以自由使用闭包。
let searchText = "John Sam"
let results = nameList.filter {
nameDictionary in
nameDictionary["firstName"] == searchText
}
或者,
let searchText = "John Sam"
let results = nameList.filter {
[=12=]["firstName"] == searchText
}
可以使用 rangeOfString()
和 .CaseInsensitiveSearch
选项实现与谓词运算符 "CONTAINS[c]"
对应的搜索:
let searchText = "MITH"
let filtered = nameList.filter {
return [=10=]["firstName"]?.rangeOfString(searchText, options: .CaseInsensitiveSearch) != nil
}
// Result: [[firstName: Smith, lastName: Green]]
Swift 3:
let filtered = nameList.filter {
return [=11=]["firstName"]?.range(of: searchText, options: .caseInsensitive) != nil
}
您可以先定义一个过滤依据的函数来进行过滤,或者只将过滤器包含在闭包中。以下是您可以粘贴到 playground 中的摘录,它演示了这两个选项:
let nameList : [Dictionary<String,String>] =
[["firstName" : "John Sam","lastName" : "Smith"],
["firstName" : "Johnny","lastName" : "Smith"],
["firstName" : "Albert","lastName" : "Smith"],
["firstName" : "Alby","lastName" : "Wright"],
["firstName" : "Smith","lastName" : "Green"]]
func fn (x: Dictionary<String,String>) -> Bool {
return x["firstName"] == "Johnny"
}
nameList.filter(fn)
var r = nameList.filter({[=10=]["firstName"] == "Johnny"})
r
var s = nameList.filter({[=10=]["lastName"] == "Smith"})
s
您还可以过滤筛选器的结果以搜索名字和姓氏,例如
var result = (nameList.filter({[=11=]["lastName"] == "Smith"})).filter({[=11=]["firstName"] == "Johnny"})
另请参阅:http://locomoviles.com/ios-tutorials/filtering-swift-array-dictionaries-object-property/
我是 swift 的新手,我有一个新项目。我正在尝试做一个搜索功能。我有一个字典数组,包含 firstName 和 lastName 作为键,我需要根据包含搜索字符串
的 firstName 过滤掉人let nameList : [Dictionary<String,String>] =
[["firstName" : "John Sam","lastName" : "Smith"],
["firstName" : "Johnny","lastName" : "Smith"],
["firstName" : "Albert","lastName" : "Smith"],
["firstName" : "Alby","lastName" : "Wright"],
["firstName" : "Smith","lastName" : "Green"]]
与 objective C 一样,我可以轻松地使用
[NSPredicate predicatewithformat:"firstName contains[c] %@",searchText]
我也知道可以在 Swift 上完成相同的谓词。但我正在寻找等效的 Swift,以便我可以了解如何使用映射和过滤器。任何帮助表示赞赏
请尝试以下方式。
我已经通过了 constant value
你需要在 someString variable
的地方通过你的 dynamic value
。
let someString = "Alby"
var arr:NSArray =
[["firstName" : "John Sam","lastName" : "Smith"],
["firstName" : "Johnny","lastName" : "Smith"],
["firstName" : "Albert","lastName" : "Smith"],
["firstName" : "Alby","lastName" : "Wright"],
["firstName" : "Smith","lastName" : "Green"]]
var pre:NSPredicate = NSPredicate(format: "firstName CONTAINS[c] %@", someString)!
var result:NSArray = arr.filteredArrayUsingPredicate(pre)
print(result)
试试,
let searchText = "John Sam"
func isMatch (nameDictionary: Dictionary<String, String>) -> Bool {
if(nameDictionary["firstName"] == searchText) {
return true
}
else {
return false
}
}
let results = nameList.filter(isMatch)
您可以自由使用闭包。
let searchText = "John Sam"
let results = nameList.filter {
nameDictionary in
nameDictionary["firstName"] == searchText
}
或者,
let searchText = "John Sam"
let results = nameList.filter {
[=12=]["firstName"] == searchText
}
可以使用 rangeOfString()
和 .CaseInsensitiveSearch
选项实现与谓词运算符 "CONTAINS[c]"
对应的搜索:
let searchText = "MITH"
let filtered = nameList.filter {
return [=10=]["firstName"]?.rangeOfString(searchText, options: .CaseInsensitiveSearch) != nil
}
// Result: [[firstName: Smith, lastName: Green]]
Swift 3:
let filtered = nameList.filter {
return [=11=]["firstName"]?.range(of: searchText, options: .caseInsensitive) != nil
}
您可以先定义一个过滤依据的函数来进行过滤,或者只将过滤器包含在闭包中。以下是您可以粘贴到 playground 中的摘录,它演示了这两个选项:
let nameList : [Dictionary<String,String>] =
[["firstName" : "John Sam","lastName" : "Smith"],
["firstName" : "Johnny","lastName" : "Smith"],
["firstName" : "Albert","lastName" : "Smith"],
["firstName" : "Alby","lastName" : "Wright"],
["firstName" : "Smith","lastName" : "Green"]]
func fn (x: Dictionary<String,String>) -> Bool {
return x["firstName"] == "Johnny"
}
nameList.filter(fn)
var r = nameList.filter({[=10=]["firstName"] == "Johnny"})
r
var s = nameList.filter({[=10=]["lastName"] == "Smith"})
s
您还可以过滤筛选器的结果以搜索名字和姓氏,例如
var result = (nameList.filter({[=11=]["lastName"] == "Smith"})).filter({[=11=]["firstName"] == "Johnny"})
另请参阅:http://locomoviles.com/ios-tutorials/filtering-swift-array-dictionaries-object-property/