“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数组,然后尝试它也工作正常
谢谢,
由于您的阵列(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)
它打印:
[ “可选(\” 印度\ “)”, “可选(\”美国\“)”,“可选(\”非洲\“)”,“可选(\”印度尼西亚\“)”,“可选(\”雅加达\“)”,“无”]
字典是'[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)
'String(描述:)'不是必需的。 - 为什么原始代码不起作用的一些解释是有用的,而不是“仅限代码”的答案。 –
'字符串(描述:)'几乎*从不*你应该用什么来“编译某些东西”。 –
对于比1行更复杂的东西,不要试图缩短它太难,可能会产生问题,使用/ guard让正确检查值更好 – Tj3n