原文鏈接:Swift: When the Functional Approach is NOT Right
譯者:天才175
更多優(yōu)秀譯文請關(guān)注我們的微信公眾號:learnSwift
昨天,我在代碼庫中找到一段我所認為的極具 Swift 風(fēng)格的代碼。
var minionImages = [UIImage]()
for i in 1...7 {
if let minionImage = UIImage(named: "minionIcon-\\(i)") {
minionImages.append(minionImage)
}
}
這真是使用函數(shù)式編程進行重構(gòu)的絕佳機會,哦吼吼!我可以做函數(shù)式編程了!??!是的,我非常激動。
那么,明顯的解決方案是在這兒使用 map:
let minionImagesMapped = (1...7)
.map { UIImage(named: "minionIcon-\\($0)") }
我對自己感到很滿意,這段代碼只有一行。但這樣做無法滿足之前的一個必要條件 - 我需要[UIImage]數(shù)組,但是這段代碼返回的是可選類型[UIImage?]數(shù)組。
所以我 google 了下,為了得到非可選類型的UIImages數(shù)組,可以使用如下方法:
let minionImagesFiltered = (1...7)
.map { UIImage(named: "minionIcon-\\($0)") }
.filter { $0 != nil}
.map { $0! }
這樣的確有用,但是我并不開森。這段代碼又長又拙笨,而且我討厭強制解包可選類型,雖然這里不會出錯。不過這都是小事,主要的原因是這樣看起來并不像原生for循環(huán)那樣簡單有效。如下圖所示:
可能這樣做是錯的,但是我最后還是選擇了for循環(huán)。我的結(jié)論是:在 Swift 中偶爾使用for循環(huán)是可以的。當(dāng)然我可能遺漏了一些東西,如果有,請在評論中告訴我!
升級
由于有些童鞋在下面的評論中以及Twitter上指出,可以在這里使用 Swift 2.0 的flatMap,我進行了修改:
let minionImagesFlattened = (1...7).flatMap { UIImage(named: "minionIcon-\\($0)") }
在這里,我不得不誠實的說,每次看到flatMap時,我都無法完全理解它做了什么或是怎么做的。它并不像map以及filter那樣自然。我不懂它在這兒是怎么做的,所以必須要去搜索一下。
由此,我再次得出結(jié)論:使用flatmap不能提高代碼可讀性。如果那些對 Swift 和函數(shù)式編程了解不多的人看到這段代碼,他們能理解發(fā)生了神馬嗎?相反,我可以確定,每個人只需看一眼就能夠理解for循環(huán)。