" hasPrefix"不在Swift工作

时间:2017-04-10 07:26:54

标签: arrays swift dictionary

我有一系列字典&我尝试使用前面的一个键过滤前缀:

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数组,那么它也能正常工作

谢谢,

3 个答案:

答案 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)