[英]Array of dictionary filter using predicate - swift3
I have array of dictionaries. 我有很多字典。
>[{"name": "John",
"address":
{"home": "addr1",
"work": "add2"}
},
{"name": "Anu",
"address": {"home": "addr1",
"work": "add2"}
}]
I am saving it to user default like this - 我将其保存为这样的用户默认值-
let personsData1 = ["name": "John", "address": {"home": "addr1", "work": "add2"}] as [String : Any] let personsData2 = ["name": "Anu", "address": {"home": "addr1", "work": "add2"}] as [String : Any] let personData1 = [“ name”:“ John”,“ address”:{“ home”:“ addr1”,“ work”:“ add2”}] as [String:Any] let personData2 = [“ name”:“ Anu “,” address“:{” home“:” addr1“,” work“:” add2“}] as [String:Any]
var persons = [personsData, personsData1]
UserDefaults.standard.set(forKey: "persons")
Retrieving it in another method and filter them on the basis of name. 用另一种方法检索它,并根据名称对其进行过滤。 let name = " John "
让名字=“ 约翰 ”
Getting below error 低于错误
Cannot invoke 'filter' with an argument list of type '((Any?) -> Bool)' 无法使用类型为(((Any?)-> Bool)'的参数列表调用'filter'
Here is the code :- 这是代码:-
func test () {
let personData1 = ["name": "John", "addresses": ["home":"addr1", "work": "addr2"]] as [String : Any]
let personData2 = ["name": "And", "addresses": ["home":"addr1", "work": "addr2"]] as [String : Any]
let persons = [personData1, personData2]
(UserDefaults.standard.set(persons, forKey: "persons")
print("Saved ----\(UserDefaults.standard.value(forKey: "persons"))")
if let savedPersons = UserDefaults.standard.value(forKey: "persons") {
let namePredicate = NSPredicate(format: "name like %@", name);
var filteredArray: [[String:Any]] = savedPersons.filter { namePredicate.evaluate(with: $0) }
print("names = \(filteredArray)")
}
}
If I try to filter like this - 如果我尝试这样过滤-
let filteredArray = savedBrs.filter { $0["name"] == name }
getting different error - 得到不同的错误-
Value of type 'Any' has no member 'filter' 类型“任何”的值没有成员“过滤器”
With NSPredicate
使用
NSPredicate
let arr = [["name":"Rego","address":["one":"peek","two":"geelo"]],["name":"pppp","address":["one":"peek","two":"geelo"]]]
let neededName = "Rego"
let pre = NSPredicate(format: "name == %@",neededName)
let result = arr.filter { pre.evaluate(with:$0) }
print(result)
Without NSPredicate
没有
NSPredicate
let result = arr.filter { $0["name"] as? String == neededName }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.