位置:首頁 > 高級語言 > Swift教學 > Swift通過閉包和函數來設置屬性的默認值

Swift通過閉包和函數來設置屬性的默認值

通過閉包和函數來設置屬性的默認值

如果某個存儲型屬性的默認值需要特彆的定製或準備,你就可以使用閉包或全局函數來為其屬性提供定製的默認值。每當某個屬性所屬的新類型實例創建時,對應的閉包或函數會被調用,而它們的返回值會當做默認值賦值給這個屬性。

這種類型的閉包或函數一般會創建一個跟屬性類型相同的臨時變量,然後修改它的值以滿足預期的初始狀態,最後將這個臨時變量的值作為屬性的默認值進行返回。

下麵列舉了閉包如何提供默認值的代碼概要:

class SomeClass {
    let someProperty: SomeType = {
        // 在這個閉包中給 someProperty 創建一個默認值
        // someValue 必須和 SomeType 類型相同
        return someValue
        }()
}

注意閉包結尾的大括號後麵接了一對空的小括號。這是用來告訴 Swift 需要立刻執行此閉包。如果你忽略了這對括號,相當於是將閉包本身作為值賦值給了屬性,而不是將閉包的返回值賦值給屬性。


注意:
如果你使用閉包來初始化屬性的值,請記住在閉包執行時,實例的其它部分都還冇有初始化。這意味著你不能夠在閉包裡訪問其它的屬性,就算這個屬性有默認值也不允許。同樣,你也不能使用隱式的self屬性,或者調用其它的實例方法。
 

下麵例子中定義了一個結構體Checkerboard,它構建了西洋跳棋遊戲的棋盤:

西洋跳棋棋盤

西洋跳棋遊戲在一副黑白格交替的 10x10 的棋盤中進行。為了呈現這副遊戲棋盤,Checkerboard結構體定義了一個屬性boardColors,它是一個包含 100 個布爾值的數組。數組中的某元素布爾值為true表示對應的是一個黑格,布爾值為false表示對應的是一個白格。數組中第一個元素代表棋盤上左上角的格子,最後一個元素代表棋盤上右下角的格子。

boardColor數組是通過一個閉包來初始化和組裝顏色值的:

struct Checkerboard {
    let boardColors: Bool[] = {
        var temporaryBoard = Bool[]()
        var isBlack = false
        for i in 1...10 {
            for j in 1...10 {
                temporaryBoard.append(isBlack)
                isBlack = !isBlack
            }
            isBlack = !isBlack
        }
        return temporaryBoard
        }()
    func squareIsBlackAtRow(row: Int, column: Int) -> Bool {
        return boardColors[(row * 10) + column]
    }
}

每當一個新的Checkerboard實例創建時,對應的賦值閉包會執行,一係列顏色值會被計算出來作為默認值賦值給boardColors。上麵例子中描述的閉包將計算出棋盤中每個格子合適的顏色,將這些顏色值保存到一個臨時數組temporaryBoard中,並在構建完成時將此數組作為閉包返回值返回。這個返回的值將保存到boardColors中,並可以通squareIsBlackAtRow這個工具函數來查詢。

let board = Checkerboard()
println(board.squareIsBlackAtRow(0, column: 1))
// 輸出 "true"
println(board.squareIsBlackAtRow(9, column: 9))
// 輸出 "false"