2017-05-27 125 views
0

數組「是否有可能去除for .. in(以使其更SWIFTY)?過濾從另一個

let arr1 = ["Bill", "John", "Richard", "Donald", "George"] 
let arr2 = ["ill", "ck", "rd", "ld"] 
var arr3 = Array<String>() 

for str in arr2 
{ 
    arr3 += arr1.filter{ $0.hasSuffix(str) } 
} 
debugPrint(arr3) // ["Bill", "Richard", "Donald"] 

謝謝!

回答

0

是的。您可以使用地圖功能與flatMap結合。如果你不想要了一倍(例如,當後綴爲「d」),使用set():

let names = ["Bill", "John", "Richard", "Donald", "George"] 
let suffixes = ["ill", "ck", "rd", "ld", "d"] 
let namesWithSuffixes = Set(suffixes.map({ suffix in names.filter({ name in name.hasSuffix(suffix) }) }).flatMap({ $0 })) 

但如果你只是想擺脫舊的for循環,你可以使用的forEach():

var arr3 = [String]() 
suffixes.forEach({ suffix in 
    arr3 += names.filter({ $0.hasSuffix(suffix) }) 
}) 

請注意您的原始解決方案和第二個解決方案只會導致24次執行,而「swifty」map.filter.flatmap使用29次執行。

enter image description here

+0

好的,謝謝xxtesaxx – Stephane

+0

不客氣。自從我瞭解地圖和flatMap本身並且在很多情況下,他們確實很有幫助(例如,在處理可選項時,他們值得研究,相信我),這已經很長時間了。我很高興我能夠幫助 – xxtesaxx

0

這是不是可以更簡潔明瞭?

arr3 = arr1.filter{name in arr2.contains{name.hasSuffix($0)}} 
+0

是的。謝謝 – Stephane