デイニシャリゼーションの動作例を示します。この例では、シンプルなゲームの 2 つの新しい型 Bank と Player を定義しています。Bank クラスは、10,000 コインを超えて分配できない架空の通貨を管理します。Bank はゲーム中に 1 つしかないため、現在の状態を保管し、管理するタイププロパティとタイプメソッドを持つクラスとして実装されています。

class Bank {
    static var coinsInBank = 10_000
    static func vendCoins(numberOfCoinsRequested: Int) -> Int {
        let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func receiveCoins(coins: Int) {
        coinsInBank += coins
    }
}

Bank は、保持している現在のコイン数を coinsInBank プロパティに記録します。また、コインの分配と収集を扱う 2 つのメソッド vendCoins(_:) と receiveCoins(_:) を持っています。

vendCoins(_:) はコインを分配する前に、銀行にコインが十分にあるかをチェックします。コインが十分に無い場合には、Bank は要求された数より小さい数を(銀行にコインが残っていない場合にはゼロを)返します。供給されるコインの実際の数を示す整数値を返します。

receiveCoins(_:) メソッドは、受け取ったコイン数を銀行のコイン庫に追加して戻します。

Player クラスはゲーム中のプレイヤーを表現しています。各プレイヤーはいくらかのコインを財布に保持しています。これはプレイヤーの coinsInPurse プロパティで表現されています。

class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        coinsInPurse = Bank.vendCoins(coins)
    }
    func winCoins(coins: Int) {
        coinsInPurse += Bank.vendCoins(coins)
    }
    deinit {
        Bank.receiveCoins(coinsInPurse)
    }
}

各 Player インスタンスは、十分にコインが無い場合には Player インスタンスが受け取る数は指定数より少なくなりますが、初期化の間に銀行からの開始手当として指定数のコインを受け取って初期化されます。

Player クラスは、銀行からいくらかのコインを受け取ってプレイヤーの財布に追加する winCoins(_:) メソッドを定義しています。Player クラスは、Player インスタンスが割り当て解除される直前に呼び出されるデイニシャライザも実装しています。このデイニシャライザは、単にプレイヤーのすべてのコインを銀行に返します。

var playerOne: Player? = Player(coins: 100)
print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
// "A new player has joined the game with 100 coins" と出力
print("There are now \(Bank.coinsInBank) coins left in the bank")
// "There are now 9900 coins left in the bank" と出力

100 コインのリクエストで新しい Player インスタンスが生成されています。この Player インスタンスは、オプショナル Player の変数 playerOne に保管されています。プレイヤーがどの時点でもゲームを抜けることができるため、ここでオプショナル変数が使用されています。オプショナルによって、プレイヤーが現在ゲーム中であるかを追うことができるようになります。

playerOne がオプショナルであるため、デフォルトのコイン数を出力するために coinsInPurse プロパティにアクセスするときや、winCoins(_:) を呼び出すときにエクスクラメーションマーク (!) を付けます。

playerOne!.winCoins(2_000)
print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// "PlayerOne won 2000 coins & now has 2100 coins" と出力
print("The bank now only has \(Bank.coinsInBank) coins left")
// "The bank now only has 7900 coins left" と出力

ここで、プレイヤーは 2,000 コインを獲得しました。プレイヤーの財布には 2,100 コインあり、銀行には 7,900 コイン残っています。

playerOne = nil
print("PlayerOne has left the game")
// "PlayerOne has left the game" と出力
print("The bank now has \(Bank.coinsInBank) coins")
// "The bank now has 10000 coins" と出力

プレイヤーがゲームを抜けました。オプショナル変数の playerOne に nil を設定し、Player インスタンスが無いことを意味しています。この時点で、Player インスタンスに対する playerOne 変数の参照が切れます。Player インスタンスを参照しているプロパティや変数が無いため、メモリを解放するために割り当てが解除されます。この直前に、自動的にデイニシャライザが呼び出され、コインが銀行に戻されます。


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.