iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Mobile Development

我將點燃Swiftの大海系列 第 8

Day8. Swift一定要會の基礎語法

  • 分享至 

  • xImage
  •  

閉包closure

今天要來介紹一個 Swift 中非常特別又強大的語法 —— 閉包(Closure)!
閉包可以想成是「可以被儲存、傳遞的 function」,功能上跟 function 非常像,但更靈活、更自由!
在加上必包有著可以捕捉並保存它周圍上下文的變數值
你也可以把它想像成是「沒有名字的 function」,超好用又常見喔!

格式

我們同樣先來介紹閉包的格式

{ (參數) -> 回傳型別 in
    //程式區塊
}

相信大家注意到了是不是長得跟 function 很像!
差別就是它沒有 func 和名字,還多了一個 in 關鍵字來分隔參數與執行內容。

使用方法

今天我們一樣先來看例子再介紹

//function 寫法
func fruitPrice() -> String {
    let apple = 15
    let grape = 10

    if apple > grape {
        return "蘋果比較貴"
    } else {
        return "葡萄比較貴"
    }
}

let result = fruitPrice()
print(result)  // ➜ 輸出:蘋果比較貴
//closure 寫法
let fruitPrice = { (apple: Int, grape: Int) -> String in
    if apple > grape {
        return "蘋果比較貴"
    } else {
        return "葡萄比較貴"
    }
}

let result = fruitPrice(15, 10)
print(result) // ➜ 輸出:蘋果比較貴

相信大家已經看出來差別了,閉包不但可以被存在變數裡
而且我們直接用變數名就能呼叫它!

進階使用技巧

  1. 參數閉包的用法
let fruitPrice = { (fruit: String, price: Int) in
    print("\(fruit)要\(price)元喔!")
}
fruitPrice("木瓜", 20) //輸出 "木瓜要20元喔!"
  1. 回傳值閉包的用法
let priceSum: (Int, Int) -> Int = { $0 * $1 }
let result = priceSum(20, 15)  // result 為 300
  1. escaping closure
    有時候我們希望閉包的執行時間不是現在馬上,而是等一下
    例如當網路請求完成、或一段延遲後再執行,這時就會用到@escaping關鍵字。
    當你把一個閉包作為參數傳進 function,而且這個閉包會在 function 結束後才執行
    就需要加上 @escaping
func fetchFruitName(completion: @escaping (String) -> Void) {
    
    DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
        completion("香蕉")
    }
}

fetchFruitName { fruit in
    print("今天吃的是:\(fruit)")  // 兩秒後輸出:今天吃的是:香蕉
}

結論

  • 閉包(Closure)本質上就是「可以儲存的函式」
  • 它長得像 function,但沒有名字
  • 它可以捕捉並保存它周圍上下文的變數值
  • 閉包可以被存進變數、當成參數傳進別的函式中

上一篇
Day7. Swift一定要會の基礎語法
系列文
我將點燃Swiftの大海8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言