[Swift] Array 陣列快速過濾函式 filter 的使用教學

在 Swift 中,如果我們要過濾出陣列中的某些元素,最常用的就是 for-in loop 了,使用迴圈來過濾固然是一個不錯的方式,但在追求精簡的 Swift 就顯得笨重許多了。Swift 提供了另一個過濾的方式,叫做 filter,只要能善用 filter,就能讓你的程式碼精簡許多,接下來我們來看一下 swift 的 filter 怎麼使用吧!

 

swift

 

首先,先看一下 filter 的函式原型。

  1. func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]

 

那我們該怎麼用呢?很簡單,只要「陣列名稱.filter {條件}」或者 「陣列名稱.filter( {條件} )」就好了。舉例如下:

  1. let cast = ["Vivien", "Marlon", "Kim", "Karl"]
  2. let shortNames = cast.filter { $0.count < 5 }
  3. print(shortNames)
  4. // Prints "["Kim", "Karl"]"

 

困擾的來了,$0 這代表什麼意思呢?其實你可以把 $0 看做陣列的元素, 以上例來說,就是 cast[0]、cast[1]、cast[2]…,所以 $0 物件的型態是  String,所以以上例來說,就會把長度是 5 以下的字串,再組合成一個新的陣列。

 

而以下為傳統的寫法,使用 for-in loop (Swift 控制流程 for-in Loop 教學)來寫。

  1. let cast = ["Vivien", "Marlon", "Kim", "Karl"]
  2. var shortNames: [String] = []
  3.  
  4. for str in cast {
  5.     if str.count < 5 {
  6.         shortNames.append(str)
  7.     }
  8. }
  9.  
  10. print(shortNames)
  11. // Prints "["Kim", "Karl"]"

 

相較於舊的寫法, filter 顯得更精簡,但時間複雜度都是 O(n) 喔!