我有一系列字典&我尝试使用前面的一个键过滤前缀:
let b = [["id":1,"name":"India"],["id":2,"name":"america"],["id":3,"name":"africa"],["id":4,"name":"indonesia"],["id":5,"name":"jakarta"],["id":6,"rec_name":"Zimba"]]
let g = b.filter({String(describing: $0["name"]).hasPrefix("I")})
print(g) //retun Empty array
如果我尝试使用contains
,那么它可以正常工作
或
如果我只尝试使用纯String数组,那么它也能正常工作
谢谢,
答案 0 :(得分:6)
由于您的数组(b
)包含的字典name
并不总是存在(您有一个rec_name
的对象),您可以将过滤器修改为以下内容:
let g = b.filter {
guard let name = $0["name"] as? String else { return false }
return name.hasPrefix("I")
}
因此确保只有具有该键值的词典才能与您的过滤器匹配
有趣的事实:当我们做这样的事情时,原始代码不起作用的原因(正如Martin指出的那样)非常明显:
let g = b.map({String(describing: $0["name"])})
print(g)
打印哪些:
[“Optional(\”India \“)”,“可选(\”america \“)”,“可选(\”africa \“)”,“可选(\”indonesia \“)”,“可选(\“jakarta \”)“,”nil“]
答案 1 :(得分:1)
请检查一下。
let b = [["id":1,"name":"India"],["id":2,"name":"america"],["id":3,"name":"africa"],["id":4,"name":"indonesia"],["id":5,"name":"jakarta"],["id":6,"rec_name":"Zimba"]]
let g = b.filter({String(describing: $0["name"] as? String ?? "").hasPrefix("I")})
print(g)
答案 2 :(得分:0)
尝试此代码,您将获得正确的解决方案。
let b = [["id":1,"name":"India"],["id":2,"name":"america"],
["id":3,"name":"africa"],["id":4,"name":"indonesia"],["id":5,"name":"jakarta"],
["id":6,"rec_name":"Zimba"]]
let g = b.filter({($0["name"] as? String ?? "").hasPrefix("I")})
print(g)