デイニシャリゼーションの動作例を示します。この例では、シンプルなゲームの 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.