在前面的幾天,我們探討了Swift的基礎部分,如變數、常數、數據類型和基本控制流。今天,我們將開始探討Swift的進階特性,首先是閉包。
閉包在Swift中是自包含的功能塊,可以在你的程式碼中被傳遞和使用。閉包可以抓取和存儲其所在的上下文中的任何常數和變數的引用。這是所謂的閉合其周圍的上下文,因此得名閉包。
如果你之前有JavaScript或其他語言的經驗,閉包與匿名函數或lambda函數有相似之處。
閉包的基本語法如下:
{ (參數) -> 返回值類型 in
// 這裡是閉包的主體部分
}
例如,以下閉包接受兩個整數參數,返回它們的和:
let sumClosure: (Int, Int) -> Int = { (a, b) in
return a + b
}
let result = sumClosure(5, 7) // 這會返回 12
閉包特別適用於那些要作為另一函數參數的短小功能塊。例如,Swift的陣列有一個sorted
方法,可以讓你提供一個閉包來定義如何比較陣列中的元素。
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let sortedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 < s2
})
Swift知道sorted(by:)
方法期望接收的閉包的類型,所以你可以使用縮寫語法,並省略類型和參數。
let sortedNamesShort = names.sorted(by: { s1, s2 in s1 < s2 })
更進一步,可以使用Swift提供的$0, $1等縮寫,代表閉包的第一個、第二個參數,並直接將其用於表達式:
let sortedNamesShortest = names.sorted(by: { $0 < $1 })
如果需要將一個很長的閉包作為函數的最後一個參數,Swift允許你使用尾隨閉包語法,將其寫在函數參數括號的外部:
let sortedNamesTrailing = names.sorted { $0 < $1 }
閉包在Swift中被廣泛使用,特別是在非同步程式設計和功能響應模式中。例如,當從網絡加載數據或等待某個長時間運行的任務完成時,可以使用閉包來捕獲完成的瞬間和結果。
總結:
閉包是Swift中一個強大而靈活的功能,它允許你編寫更加簡潔、直觀和模組化的程式碼。