昨天,我在代碼庫中找到一段我所認為的極具Swift風格的代碼。
[cpp] view plaincopy
var minionImages = [UIImage]()
for i in 1...7 {
if let minionImage = UIImage(named: "minionIcon-\(i)") {
minionImages.append(minionImage)
}
}
這真是使用函數式編程進行重構的絕佳機會,哦吼吼!我可以做函數式編程了!!!是的,我非常激動。
那么,明顯的解決方案是在這兒使用map:
[cpp] view plaincopy
let minionImagesMapped = (1...7)
.map { UIImage(named: "minionIcon-\($0)") }
我對自己感到很滿意,這段代碼只有一行。但這樣做無法滿足之前的一個必要條件——我需要[UIImage]數組,但是這段代碼返回的是可選類型[UIImage?]數組。
所以我Google了一下,為了得到非可選類型的UIImages數組,可以使用如下方法:
[cpp] view plaincopy
let minionImagesFiltered = (1...7)
.map { UIImage(named: "minionIcon-\($0)") }
.filter { $0 != nil}
.map { $0! }
這樣的確有用,但是我并不開森。這段代碼又長又拙笨,而且我討厭強制解包可選類型,雖然這里不會出錯。不過這都是小事,主要的原因是這樣看起來并不像原生for循環那樣簡單有效。如下圖所示:

可能這樣做是錯的,但是我后還是選擇了for循環。我的結論是:在Swift中偶爾使用for循環是可以的。當然我可能遺漏了一些東西,如果有,請在評論中告訴我!
由于有些童鞋在下面的評論中以及Twitter上指出,可以在這里使用 Swift 2.0 的flatMap,我進行了修改:
[cpp] view plaincopy
let minionImagesFlattened = (1...7).flatMap { UIImage(named: "minionIcon-\($0)") }
在這里,我不得不誠實的說,每次看到flatMap時,我都無法完全理解它做了什么或是怎么做的。它并不像map以及filter那樣自然。我不懂它在這兒是怎么做的,所以必須要去搜索一下。
由此,我再次得出結論:使用flatmap不能提高代碼可讀性。如果那些對Swift和函數式編程了解不多的人看到這段代碼,他們能理解發生了神馬嗎?相反,我可以確定,每個人只需看一眼就能夠理解for循環。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。