Swift 5.8 日本語化計画 : Swift 5.8


デイニシャライザ


カスタムクリーンアップが必要なリソースを解放します。


クラスインスタンスの割り当てが解除される直前に、初期化解除子(デイニシャライザ) は呼び出されます。イニシャライザを init キーワードで書くのと同じように deinit キーワードでデイニシャライザを書いて下さい。デイニシャライザはクラス型でのみ利用可能です。



デイニシャライザはどのように働くか


インスタンスがもはや必要とされない時、Swift は、リソースを解放するために、自動的にインスタンスを割り当て解除します。自動参照カウント で説明したように Swift は、自動参照カウント (ARC) を介してインスタンスのメモリ管理を処理します。通常は、インスタンスが割り当て解除された場合、手動でクリーンアップを実行する必要はありません。しかし、あなた自身のリソースを操作している時は、いくつか追加のクリーンアップを自分で実行する必要があります。例えば、ファイルを開き、それにいくつかのデータを書き込むためのカスタムクラスを作成する場合、クラスインスタンスの割り当てが解除される前に、そのファイルを閉じる必要があります。


クラス定義は、クラスごとに最大で1つのデイニシャライザを持つことができます。デイニシャライザはパラメータを全く取らず、括弧なしで書きます:


  1. deinit {
  2. // perform the deinitialization
  3. }


デイニシャライザは、インスタンスの割り当て解除が行われる直前に、自動的に呼び出されます。あなた自身でデイニシャライザを呼び出すことは許可されていません。スーパークラスのデイニシャライザは、それらのサブクラスに継承され、スーパークラスのデイニシャライザはサブクラスのデイニシャライザの実装の最後に自動的に呼び出されます。スーパークラスのデイニシャライザは、サブクラスが独自のデイニシャライザを提供していない場合でも、常に呼び出されます。


インスタンスはそのデイニシャライザが呼び出された後まで割り当て解除されないため、デイニシャライザは、それが呼び出されるインスタンスのすべてのプロパティにアクセスすることができ、これらのプロパティに基づいてその動作を変更することができます (閉じる必要のあるファイルの名前を検索するように)。



作動中のデイニシャライザ


ここに作動中のデイニシャライザの例を挙げます。この例では、簡単なゲームのための、2つの新しい型、BankPlayer を定義しています。Bank クラスは、循環している 10,000 以上のコインは決してない架空の通貨を管理します。ゲーム内には1つの Bank しかなく、そのため Bank は、型プロパティや、その現在の状態を格納し管理するためのメソッドを持つクラスとして実装されています。


  1. class Bank {
  2. static var coinsInBank = 10_000
  3. static func distribute(coins numberOfCoinsRequested: Int) -> Int {
  4. let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
  5. coinsInBank -= numberOfCoinsToVend
  6. return numberOfCoinsToVend
  7. }
  8. static func receive(coins: Int) {
  9. coinsInBank += coins
  10. }
  11. }


Bank は、その coinsInBank プロパティで、保持しているコインの現在の数を追跡します。また、2つのメソッド、 distribute(coins:)receive(coins:) を提供し、硬貨の流通と回収を処理しています。


distribute(coins:) メソッドはコインを流通させる前に、銀行に十分なコインがあることを確認します。十分なコインがない場合、Bank は、要求された数よりも少ない数を返します (そしてコインが銀行に残っていない場合は、ゼロを返します)。これは、提供されたコインの実際の数を示す、整数値を返します。


receive(coins:) メソッドは、銀行のコインの保管にコインの受領した数を単に追加します。


Player クラスは、ゲームでのプレイヤーを表しています。各プレイヤーはいつでも自分の財布の中に保管したコインの数だけ持っています。これは、プレイヤーの coinsInPurse プロパティで表されます。


  1. class Player {
  2. var coinsInPurse: Int
  3. init(coins: Int) {
  4. coinsInPurse = Bank.distribute(coins: coins)
  5. }
  6. func win(coins: Int) {
  7. coinsInPurse += Bank.distribute(coins: coins)
  8. }
  9. deinit {
  10. Bank.receive(coins: coinsInPurse)
  11. }
  12. }


Player インスタンスは、初期化中に銀行から指定された数だけコインを、開始時の割当量で初期化され、十分なコインを利用できない場合 Player インスタンスはその数より少ないコインしか受け取ることができません。


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


  1. var playerOne: Player? = Player(coins: 100)
  2. print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
  3. // prints "A new player has joined the game with 100 coins"
  4. print("There are now \(Bank.coinsInBank) coins left in the bank")
  5. // prints "There are now 9900 coins left in the bank"


新しい Player インスタンスが作成されると、利用可能な場合は、100 コインを要求します。この Player インスタンスは playerOne と言う optional な Player 変数に格納されます。プレイヤーはいつの時点でもゲームをやめることができるので、optional 変数がここでは使用されます。optional で、現在ゲーム内にプレイヤーがいるかどうかを追跡できます。


playerOne は optional のため、その coinsInPurse プロパティがコインのデフォルトの数を印刷するようにアクセスされた時、いつでもその win(coins:) メソッドが呼び出されるので感嘆符 (!)で修飾されています。


  1. playerOne!.win(coins: 2_000)
  2. print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
  3. // prints "PlayerOne won 2000 coins & now has 2100 coins"
  4. print("The bank now only has \(Bank.coinsInBank) coins left")
  5. // prints "The bank now only has 7900 coins left"


ここで、プレイヤーは 2000 コインを獲得しました。プレイヤーの財布には今 2100 コインがあり、銀行には 7,900 コインしか残っていません。


  1. playerOne = nil
  2. print("PlayerOne has left the game")
  3. // prints "PlayerOne has left the game"
  4. print("The bank now has \(Bank.coinsInBank) coins")
  5. // prints "The bank now has 10000 coins"


プレイヤーは今ゲームをやめました。これは optional の playerOne 変数を nil に設定することで示され、"全く Player インスタンスがない" 事を意味します。これが発生した時点で、Player インスタンスへの playerOne 変数の参照は壊れています。他のプロパティや変数はもう Player インスタンスを参照していないので、そのメモリを解放するために割り当て解除されます。これが発生する直前に、そのデイニシャライザは自動的に呼び出され、そのコインは銀行に戻されます。



前:初期化 次:Optional の連鎖
















トップへ












トップへ












トップへ












トップへ
目次
Xcode の新機能

Swift について
Swift と Cocoa と Objective-C (obsolete)
Swift Blog より (obsolete)

SwiftLogo
  • Swift 5.8 全メニュー


  • Swift へようこそ
  • Swift について
  • Swift 言語のガイド
  • Swift の基本
  • 基本演算子
  • 文字列と文字
  • コレクション型
  • フロー制御
  • 関数
  • クロージャ
  • 列挙型
  • 構造体とクラス
  • プロパティ
  • メソッド
  • サブスクリプト
  • 継承
  • 初期化
  • デイニシャライザ
  • Optional の連鎖
  • エラー処理
  • 同時実行
  • 型キャスト
  • ネストした型
  • 拡張機能
  • プロトコル
  • ジェネリック(汎用)
  • 不透明な型
  • 自動参照カウント
  • メモリの安全性
  • アクセス制御
  • 高度な演算子

  • 言語リファレンス

  • マニュアルの変更履歴













  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ