ストアドプロパティのデフォルト値にカスタマイズやセットアップが必要な場合に、クロージャやグローバル関数を利用して、そのプロパティのデフォルト値をカスタマイズすることができます。プロパティが属する型の新しいインスタンスが初期化されるときに、クロージャまたは関数が呼び出され、その戻り値がプロパティのデフォルト値として代入されます。

この種のクロージャや関数は一般的に、プロパティと同じ型の一時的な値を生成し、求める初期状態に合うようその値を変更して、プロパティのデフォルト値として利用されるようその一時的な値を返します。

次は、プロパティのデフォルト値のために利用されるクロージャの概略です。

class SomeClass {
    let someProperty: SomeType = {
        // このクロージャ内で someProperty のデフォルト値を生成
        // someValue は SomeType と同じ型にする
        return someValue
    }()
}

クロージャの閉じ波括弧の後に、丸括弧のペアを続けることに注目してください。これにより、Swift はクロージャを即座に実行します。丸括弧を省略した場合、クロージャの戻り値ではなく、クロージャそのものをプロパティに代入しようとしていることになります。

NOTE
プロパティを初期化するためにクロージャを利用する場合、クロージャが実行される時点ではインスタンスの残りの部分はまだ初期化されていないことを覚えておいてください。つまり、プロパティにデフォルト値がある場合でも、クロージャ内からは他のプロパティ値にアクセスできません。また、非明示的な self プロパティも利用することや、インスタンスメソッドを呼び出すこともできません。

次の例では、チェスのゲームボードをモデル化する構造体 Chessboard を定義しています。チェスは白黒のマスが交互に並ぶ 8 x 8 のボードで遊びます。

image: chessBoard_2x

このゲームボードを表現するために、構造体 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.