Swift 中的過濾器

tgot5729 8年前發布 | 6K 次閱讀 Swift Apple Swift開發

Swift 提供了很多方便的函數來操作數組,比如 filter 和 map。在這篇文章里,我將帶大家熟悉一下 filter,以及學習如何使用 map 來組合出新的數組。

假設你有一個數組,接著你想要創建一個新的數組,這個數組包含原數組中所有大于 10 的元素,你可以使用下面的 for 循環:

let anArray = Array(1...20)

var anotherArray = [Int]()

for i in anArray {
    if i > 10 {
        anotherArray.append(i)
    }
}

print(anotherArray) // [11,12,13,14,15,16,17,18,19,20]

除了代碼多點,也沒什么問題。

Filter

但是你可以嘗試使用一下 filter 函數,這是 Swift 為每個數組提供的一個新式武器,可以大大縮減枚舉的代碼量:

let anotherArray = anArray.filter({ (a:Int) -> Bool in
    return a > 10
})

print(anotherArray)

該函數帶一個閉包做為參數,這個閉包將數組中的元素作為參數,并返回一個 bool 結果。數組中的每一個元素都會執行該閉包,根據返回的結果來決定是否應存在于新的數組中。

通過 Swift 提供的閉包簡化寫法,我們可以進一步精簡:

let anotherArray = anArray.filter ({$0 > 10})

print(anotherArray) // [11,12,13,14,15,16,17,18,19,20]

和最初的版本對比一下,是不是精簡了許多呢:)。

使用 map 來組合

數組還提供了一個有趣的函數 map,該函數同樣是帶一個閉包作為參數并且在內部返回一個經過轉換的元素。所以我們先篩選出數組中所有大于 10 的元素,然后讓它們的值翻一倍:

let anArray = Array(1...20)

let anotherArray = anArray.filter({$0 > 10}).map({$0 * 2})

print(anotherArray) // [22, 24, 26, 28, 30, 32, 34, 36, 38, 40]

關于 map 更多的細節,可以查看我此前寫的一篇文章

當然你只能在條件不太復雜時這么做,如果情況比較復雜,這種寫法將使代碼變得更加難讀。大體來說就是,如果為了可讀性,那么多寫點代碼還是值得的。

來自:http://swift.gg/2016/05/10/swift-filter/

 本文由用戶 tgot5729 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!