iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 2
0
自我挑戰組

iOS 新手開發的大小事系列 第 2

Day 2: [Swift] 閉包 (Closures) -1

  • 分享至 

  • xImage
  •  

前言

在剛開始接觸 iOS 開發時,最常遇到的就是閉包,但當時對閉包很陌生,也不了解實際的用途為何,於是查了很多資料,才對閉包的概念跟實際用途有更進一步的了解。閉包的內容分為以下所述:

  • 閉包表達式
  • 尾隨閉包
  • 捕獲值
  • 逃逸閉包
  • 自動閉包

今天內容會介紹前兩項,後三項會放在明天的內容。


何謂閉包

在學習 Swift 的過程中,閉包 (closure) 是一定需要了解的概念,閉包簡易來說就是一種匿名函式 (function)。

一門程式語言要支援閉包的前提有兩個。

  • 支援函式型別,能夠將函式作為參數或回傳值傳遞。
  • 支援巢狀函式。

閉包採用以下三種形式之一:

  • 全局函數:一個有名字但不會捕獲任何值的閉包。
  • 內嵌函數:是一個有名字且能從其上層函數捕獲值的閉包。
  • 閉包表達式:是一個輕量級語法所寫的可以捕獲其上下文中常量或變量值的沒有名字的閉包。

在 Apple 的官方文件中寫到閉包表達語法 (Closure Expression Syntax) 為:

{ (parameters) -> return type in
    statements
}

閉包的概念

先用函式寫個簡單的功能,輸入一組陣列,回傳陣列的條件為比某值小。

func filterLessThanValue(value: Int, numbers: [Int]) -> [Int] {
    var filterArray = [Int]()
    for num in numbers {
        if num < value {
            filterArray.append(num)
        }
    }
    return filterArray
}

此時若要改變以上函式的功能,例如改輸出為比某值大,就必須進入函式內修改,以下將利用閉包可將程式變得更為彈性。

// 將傳入參數改為閉包
func filterWithClosure(closure: (Int) -> Bool, numbers: [Int]) -> [Int] {
    var filterNumbers = [Int]()
    for num in numbers {
        if closure(num) {
            filterNumbers.append(num)
        }
    }
    return filterNumbers
}

// 可在呼叫函式時直接更改判斷的條件
let filterList = filterWithClosure(closure: { (num) -> Bool in
    return num < 5
}, numbers: [1, 2, 3, 4, 5, 10])

尾隨閉包 (Trailing Closures)

尾隨閉包是一種表達式,當傳入的閉包運算式很長,為了增加程式的可讀性,並將閉包放在傳入值的尾端,所用的表達式,就稱為尾隨閉包。

func someFunctionThatTakesAClosure(number: Int, closure: () -> Void) {
    // 函式的功能
}

// 呼叫函式時使用非尾隨閉包
someFunctionThatTakesAClosure(number: 10, closure: {
    // 閉包內容
})

// 呼叫函式時使用尾隨閉包
someFunctionThatTakesAClosure(number: 10) {
    // 尾隨閉包內容
}

上一篇
Day 1: iOS 新手的啟程之路
下一篇
Day 3: [Swift] 閉包 (Closures) -2
系列文
iOS 新手開發的大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ytyubox
iT邦新手 5 級 ‧ 2019-09-18 00:07:48

匿名函式的部分有些誤會喔,wiki:
匿名函式(英語:Anonymous Function)在電腦編程中是指一類無需定義識別碼(函式名)的函式或子程式,普遍存在於多種程式語言中。

比較簡單完整的 Swift 實作

let number = { (x:Int, y:Int) -> Int in
    return x + y
}(0, 1)

我要留言

立即登入留言