“hasPrefix”不是斯威夫特

问题描述:

工作,我有字典&数组我尝试使用此按键可作为后续的一个前缀过滤:“hasPrefix”不是斯威夫特

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数组,然后尝试它也工作正常

谢谢,

+2

'字符串(描述:)'几乎*从不*你应该用什么来“编译某些东西”。 –

+0

对于比1行更复杂的东西,不要试图缩短它太难,可能会产生问题,使用/ guard让正确检查值更好 – Tj3n

由于您的阵列(b)包含字典,其中name并不总是存在(你有rec_name的对象),你可以修改你的过滤器是这样的:

let g = b.filter { 
    guard let name = $0["name"] as? String else { return false } 
    return name.hasPrefix("I") 
} 

,从而使确保只有与该密钥值匹配的字典才能与您的过滤器匹配


有趣的事实:原因L码不起作用(马丁指出的)是很明显的,当我们做这样的事情:

let g = b.map({String(describing: $0["name"])}) 
print(g) 

它打印:

[ “可选(\” 印度\ “)”, “可选(\”美国\“)”,“可选(\”非洲\“)”,“可选(\”印度尼西亚\“)”,“可选(\”雅加达\“)”,“无”]

+0

字典是'[String:Any]'类型的,所以密钥不仅可以不存在,而且其值也可以不是字符串。你的过滤器已经可以处理,但它可能值得一提。 –

请检查与此。

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) 
+0

'String(描述:)'不是必需的。 - 为什么原始代码不起作用的一些解释是有用的,而不是“仅限代码”的答案。 –