ストアドプロパティのデフォルト値にカスタマイズやセットアップが必要な場合に、クロージャやグローバル関数を利用して、そのプロパティのデフォルト値をカスタマイズすることができます。プロパティが属する型の新しいインスタンスが初期化されるときに、クロージャまたは関数が呼び出され、その戻り値がプロパティのデフォルト値として代入されます。
この種のクロージャや関数は一般的に、プロパティと同じ型の一時的な値を生成し、求める初期状態に合うようその値を変更して、プロパティのデフォルト値として利用されるようその一時的な値を返します。
次は、プロパティのデフォルト値のために利用されるクロージャの概略です。
class SomeClass {
let someProperty: SomeType = {
// このクロージャ内で someProperty のデフォルト値を生成
// someValue は SomeType と同じ型にする
return someValue
}()
}
クロージャの閉じ波括弧の後に、丸括弧のペアを続けることに注目してください。これにより、Swift はクロージャを即座に実行します。丸括弧を省略した場合、クロージャの戻り値ではなく、クロージャそのものをプロパティに代入しようとしていることになります。
self
プロパティも利用することや、インスタンスメソッドを呼び出すこともできません。
次の例では、チェスのゲームボードをモデル化する構造体 Chessboard
を定義しています。チェスは白黒のマスが交互に並ぶ 8 x 8 のボードで遊びます。
このゲームボードを表現するために、構造体 Chessboard
には 64 個の Bool
値配列である boardColors
プロパティがあります。この配列での true
値は黒のマスで、false
値は白のマスを表しています。配列の最初はボードの左上のマスを、最後はボードの右下のマスを表しています。
色の値をセットアップするためのクロージャで、boardColors
配列は初期化されます。
struct Chessboard {
let boardColors: [Bool] = {
var temporaryBoard = [Bool]()
var isBlack = false
for i in 1...8 {
for j in 1...8 {
temporaryBoard.append(isBlack)
isBlack = !isBlack
}
isBlack = !isBlack
}
return temporaryBoard
}()
func squareIsBlackAtRow(row: Int, column: Int) -> Bool {
return boardColors[(row * 8) + column]
}
}
新しい Chessboard
インスタンスが生成されるときに、クロージャが実行されて、boardColors
のデフォルト値が算出されて返されます。この例でのクロージャは、一時的な配列 temporaryBoard
でボードの各マスに適切な色を算出して設定し、セットアップが完了するとクロージャの戻り値としてこの一時的な配列を返します。返された配列の値は boardColors
に保管され、squareIsBlackAtRow
ユーティリティ関数で問い合わせできます。
let board = Chessboard()
print(board.squareIsBlackAtRow(0, column: 1))
// "true" と出力
print(board.squareIsBlackAtRow(7, column: 7))
// "false" と出力
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.