閉包是 Swift 中一種字包含的函數或代碼區塊,可以在代碼中傳遞和使用,且能夠捕捉和儲存其作用範圍內的變量和常數。
閉包的基本結構:
{ (參數) -> 回傳類型 in}
//代碼區塊
}
一個沒有參數和回傳值的閉包
let greet = {
print("Hello, World!")
}
greet() //輸出 "Hello, World!"
閉包可以接受參數
let greetWithName = { (name: String) in
print("Hello, \(name)!")
}
greetWithName("Alice") //輸出 "Hello, Alice!"
閉包可以回傳值
let addNumbers = { (a: Int, b: Int) -> Int in
return a + b
}
let result = addNumbers(5, 3)
print(result) // 8
Swift支援閉包的簡化寫法,如果閉包的型別已經確定,參數型別和回傳類型可以省略
let multiplyNumbers: (Int, Int) -> Int = { $0 * $1 }
let result = multiplyNumbers(4, 3) // result 為 12
閉包常常被用來當作函數的參數,就像 Swift 函式庫裡的 sort 函數也是
let numbers = [5, 3, 8, 2, 9]
let sortedNumbers = numbers.sorted { $0 < $1 }
print(sortedNumbers) //輸出 [2, 3, 5, 8, 9]
當閉包在函數返回後才會執行時,稱為逃逸閉包。需要使用 @escaping 標記:
func performAsyncTask(completion: @escaping () -> void) {
DispatchQueue.global().asyn {
//模擬異步操作
completion()
}
}
閉包可以捕獲其外部的變量
func makeCounter() -> () -> Int {
var count = 0
return {
count += 1
return count
}
}
let counter = makeCounter
print(counter()) // 輸出 1
print(counter()) // 輸出 2
閉包捕捉 count 並保存其狀態