Swift 6.0 beta 日本語化計画 : Swift 6.0 beta
デイニシャライザ
クラスインスタンスの割り当てが解除される直前に、初期化解除子(デイニシャライザ) は呼び出されます。イニシャライザを init キーワードで書くのと同じように deinit キーワードでデイニシャライザを書いて下さい。デイニシャライザはクラス型でのみ利用可能です。
インスタンスがもはや必要とされない時、Swift は、リソースを解放するために、自動的にインスタンスを割り当て解除します。自動参照カウント で説明したように Swift は、自動参照カウント (ARC) を介してインスタンスのメモリ管理を処理します。通常は、インスタンスが割り当て解除された場合、手動でクリーンアップを実行する必要はありません。しかし、あなた自身のリソースを操作している時は、いくつか追加のクリーンアップを自分で実行する必要があります。例えば、ファイルを開き、それにいくつかのデータを書き込むためのカスタムクラスを作成する場合、クラスインスタンスの割り当てが解除される前に、そのファイルを閉じる必要があります。
クラス定義は、クラスごとに最大で1つのデイニシャライザを持つことができます。デイニシャライザはパラメータを全く取らず、括弧なしで書きます:
デイニシャライザは、インスタンスの割り当て解除が行われる直前に、自動的に呼び出されます。あなた自身でデイニシャライザを呼び出すことは許可されていません。スーパークラスのデイニシャライザは、それらのサブクラスに継承され、スーパークラスのデイニシャライザはサブクラスのデイニシャライザの実装の最後に自動的に呼び出されます。スーパークラスのデイニシャライザは、サブクラスが独自のデイニシャライザを提供していない場合でも、常に呼び出されます。
インスタンスはそのデイニシャライザが呼び出された後まで割り当て解除されないため、デイニシャライザは、それが呼び出されるインスタンスのすべてのプロパティにアクセスすることができ、これらのプロパティに基づいてその動作を変更することができます (閉じる必要のあるファイルの名前を検索するように)。
ここに作動中のデイニシャライザの例を挙げます。この例では、簡単なゲームのための、2つの新しい型、Bank と Player を定義しています。Bank クラスは、循環している 10,000 以上のコインは決してない架空の通貨を管理します。ゲーム内には1つの Bank しかなく、そのため Bank は、型プロパティや、その現在の状態を格納し管理するためのメソッドを持つクラスとして実装されています。
Bank は、その coinsInBank プロパティで、保持しているコインの現在の数を追跡します。また、2つのメソッド、 distribute(coins:) と receive(coins:) を提供し、コインの流通と回収を処理しています。
distribute(coins:) メソッドはコインを流通させる前に、bank(銀行) に十分なコインがあることを確認します。十分なコインがない場合、Bank は、要求された数よりも少ない数を返します (そしてコインが銀行に残っていない場合は、ゼロを返します)。これは、提供されたコインの実際の数を示す、整数値を返します。
receive(coins:) メソッドは、銀行のコインの保管にコインの受領した数を単に追加します。
Player クラスは、ゲームでのプレイヤーを表しています。各プレイヤーはいつでも自分の財布の中に保管したコインの数だけ持っています。これは、プレイヤーの coinsInPurse プロパティで表されます。
各 Player インスタンスは、初期化中に銀行から指定された数だけコインを、開始時の割当量で初期化され、十分なコインを利用できない場合 Player インスタンスはその数より少ないコインしか受け取ることができません。
Player クラスは、銀行からコインの一定数を取得し、プレイヤーの財布にそれを追加する win(coins:) メソッドを定義しています。また、Player クラスは、Player インスタンスが割り当て解除される直前に呼び出されるデイニシャライザも実装しています。ここでは、デイニシャライザは単に銀行にプレイヤーのコインのすべてを返します。
新しい Player インスタンスが作成されると、利用可能な場合は、100 コインを要求します。この Player インスタンスは playerOne と言う optional な Player 変数に格納されます。プレイヤーはいつの時点でもゲームをやめることができるので、optional 変数がここでは使用されます。optional で、現在ゲーム内にプレイヤーがいるかどうかを追跡できます。
playerOne は optional のため、その coinsInPurse プロパティがコインのデフォルトの数を印刷するようにアクセスされた時、いつでもその win(coins:) メソッドが呼び出されるので感嘆符 (!)で修飾されています。
ここで、プレイヤーは 2000 コインを獲得しました。プレイヤーの財布には今 2100 コインがあり、銀行には 7,900 コインしか残っていません。
プレイヤーは今ゲームをやめました。これは optional の playerOne 変数を nil に設定することで示され、"全く Player インスタンスがない" 事を意味します。これが発生した時点で、Player インスタンスへの playerOne 変数の参照は壊れています。他のプロパティや変数はもう Player インスタンスを参照していないので、そのメモリを解放するために割り当て解除されます。これが発生する直前に、そのデイニシャライザは自動的に呼び出され、そのコインは銀行に戻されます。