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"