2017-04-10 43 views
1

工作,我有字典&數組我嘗試使用此按鍵可作爲後續的一個前綴過濾:「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

回答

6

由於您的陣列(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]'類型的,所以密鑰不僅可以不存在,而且其值也可以不是字符串。你的過濾器已經可以處理,但它可能值得一提。 –

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

'String(描述:)'不是必需的。 - 爲什麼原始代碼不起作用的一些解釋是有用的,而不是「僅限代碼」的答案。 –