Swift-initialization
Swift-初期化
Swift 4で宣言されたクラス、構造、および列挙は、クラスのインスタンスを準備するために初期化されます。 格納されたプロパティの初期値が初期化され、新しいインスタンスの初期値も初期化され、さらに先に進みます。 初期化関数を作成するためのキーワードは、「init()」メソッドによって実行されます。 Swift 4初期化子は、値を返さないという点でObjective-Cと異なります。 その機能は、処理前に新しく作成されたインスタンスの初期化をチェックすることです。 Swift 4は、インスタンスの割り当てが解除されると、メモリ管理操作を実行するための「初期化解除」プロセスも提供します。
格納されたプロパティの初期化ロール
格納されたプロパティは、インスタンスを処理する前に、クラスと構造のインスタンスを初期化する必要があります。 格納されたプロパティは、イニシャライザを使用して値を割り当てて初期化し、プロパティオブザーバを呼び出す必要をなくします。 保存されたプロパティで初期化子が使用されます
- 初期値を作成します。
- プロパティ定義内でデフォルトのプロパティ値を割り当てます。
- 特定のデータ型のインスタンスを初期化するには、「init()」を使用します。 init()関数内では引数は渡されません。
構文
例
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
ここで、構造 'rectangle’は、メンバーの長さと幅を 'Double’データ型として初期化されます。 Init()メソッドは、新しく作成されたメンバーlengthおよびdoubleの値を初期化するために使用されます。 四角形の面積は、四角形関数を呼び出して計算され、返されます。
デフォルトでプロパティ値を設定する
Swift 4言語は、格納されているプロパティ値を初期化するInit()関数を提供します。 また、ユーザーは、クラスまたは構造体のメンバーを宣言するときに、デフォルトでプロパティ値を初期化するためのプロビジョニングを持っています。 プロパティがプログラム全体で同じ値のみをとる場合、init()で初期化するのではなく、宣言セクションで単独で宣言できます。 デフォルトでプロパティ値を設定すると、クラスまたは構造に継承が定義されているときにユーザーが有効になります。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
ここで、init()で長さと幅を宣言する代わりに、値は宣言自体で初期化されます。
パラメータの初期化
Swift 4言語では、ユーザーは、init()を使用して初期化子の定義の一部としてパラメーターを初期化することができます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
ローカルおよび外部パラメーター
初期化パラメーターには、関数およびメソッドのパラメーターと同様のローカルおよびグローバルのパラメーター名があります。 ローカルパラメータ宣言は初期化本体内のアクセスに使用され、外部パラメータ宣言は初期化子の呼び出しに使用されます。 Swift 4初期化子は、どの関数を呼び出すためにどの初期化子が使用されるかを識別しないという点で、関数およびメソッドの初期化子と異なります。
これを克服するために、Swift 4はinit()の各パラメーターに自動外部名を導入します。 この自動外部名は、すべての初期化パラメーターの前に記述されたローカル名と同等です。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
外部名のないパラメーター
アンダースコアの初期化に外部名が必要ない場合、デフォルトの動作をオーバーライドするために「_」が使用されます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
オプションのプロパティタイプ
あるインスタンスの保存されたプロパティが値を返さない場合、そのプロパティは「オプション」タイプで宣言され、その特定のタイプに対して「値なし」が返されることを示します。 保存されたプロパティが「オプション」として宣言されると、初期化中に値が自動的に「nil」に初期化されます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
初期化中の定数プロパティの変更
また、初期化により、ユーザーは定数プロパティの値も変更できます。 初期化中に、クラスプロパティを使用すると、サブクラスではなくスーパークラスによってクラスインスタンスを変更できます。 たとえば、前のプログラムで、「長さ」がメインクラスで「変数」として宣言されていることを考慮してください。 以下のプログラム変数「長さ」は「定数」変数として変更されます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
デフォルトの初期化子
デフォルトの初期化子は、デフォルト値を持つ基本クラスまたは構造体のすべての宣言されたプロパティに新しいインスタンスを提供します。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます。 −
上記のプログラムは、クラス名を「defaultexample」として定義されています。 3つのメンバー関数は、デフォルトで「studname?」として初期化されます「nil」値、「stmark」を98、「pass」をブール値「true」として保存します。 同様に、クラスのメンバータイプを処理する前に、クラスのメンバー値をデフォルトとして初期化できます。
構造型のメンバーごとの初期化子
カスタム初期化子がユーザーによって提供されない場合、Swift 4の構造型は自動的に「メンバーごとの初期化子」を受け取ります。 その主な機能は、デフォルトのメンバーごとの初期化で新しい構造体インスタンスを初期化することです。その後、新しいインスタンスプロパティが名前ごとにメンバーごとに初期化されます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
構造体は、「長さ」を「100.0」、「幅」を「200.0」として初期化するときに、メンバーシップ関数に対してデフォルトで初期化されます。 ただし、変数の長さおよび幅の処理中、値は24.0および32.0としてオーバーライドされます。
値型の初期化子委任
初期化子委任は、他の初期化子から初期化子を呼び出すこととして定義されます。 その主な機能は、複数の初期化子間でのコードの重複を回避するための再利用性として機能することです。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
初期化子委任のルール
Value Types | Class Types |
---|---|
Inheritance is not supported for value types like structures and enumerations. Referring other initializers is done through self.init | Inheritance is supported. Checks all stored property values are initialized |
クラスの継承と初期化
クラス型には、定義された保存済みプロパティが初期値、つまり指定された初期化子と便利な初期化子を受け取るかどうかを確認するための2種類の初期化子があります。
指定された初期化子と便利な初期化子
Designated Initializer | Convenience Initializer |
---|---|
Considered as primary initializes for a class | Considered as supporting initialize for a class |
All class properties are initialized and appropriate superclass initializer are called for further initialization | Designated initializer is called with convenience initializer to create class instance for a specific use case or input value type |
At least one designated initializer is defined for every class | No need to have convenience initializers compulsory defined when the class does not require initializers. |
Init(parameters) \{ statements } | convenience init(parameters) \{ statements } |
指定された初期化プログラム
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
便利な初期化プログラム
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
初期化子の継承とオーバーライド
Swift 4では、デフォルトでは、サブクラスがそのメンバータイプのスーパークラス初期化子を継承することを許可していません。 継承は、自動イニシャライザの継承で説明するある程度まで、スーパークラスのイニシャライザにのみ適用できます。
ユーザーがスーパークラスで初期化子を定義する必要がある場合、初期化子を持つサブクラスをカスタム実装としてユーザーが定義する必要があります。 サブクラスによってオーバーライドが行われる必要がある場合、スーパークラスの 'override’キーワードを宣言する必要があります。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
動作中の指定および便利な初期化子
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Failable Initializer
ユーザーは、クラス、構造、または列挙値の定義中に初期化子の障害が発生したときに通知を受ける必要があります。 変数の初期化が原因で失敗することがあります-
- 無効なパラメーター値。
- 必要な外部ソースがありません。
- 初期化の成功を妨げる条件。
初期化メソッドによってスローされた例外をキャッチするために、Swift 4は「failable initializer」と呼ばれる柔軟な初期化を生成し、構造体、クラス、または列挙メンバーの初期化中に何かが気付かれていないことをユーザーに通知します。 失敗可能な初期化子をキャッチするキーワードは「init?」です。 また、フェイル可能イニシャライザとフェイル不可イニシャライザを同じパラメータタイプと名前で定義することはできません。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
列挙の失敗可能な初期化子
Swift 4言語は、列挙型メンバーが値の初期化を終了したときにユーザーに通知するために、列挙型のFailableイニシャライザーを使用する柔軟性を提供します。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
クラスの失敗可能な初期化子
列挙型および構造体で宣言された失敗可能な初期化子は、その実装内の任意の状況で初期化の失敗を警告します。 ただし、クラスの失敗可能な初期化子は、保存されたプロパティが初期値に設定された後にのみ失敗を警告します。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Failable Initializerのオーバーライド
初期化のように、ユーザーは、サブクラス内のスーパークラスのフェイル可能なイニシャライザーをオーバーライドする機能も備えています。 スーパークラスのフェイル可能初期化は、サブクラスのフェイル不可初期化子でオーバーライドすることもできます。
サブクラス初期化子は、失敗しないサブクラス初期化で失敗するスーパークラス初期化子をオーバーライドする場合、スーパークラス初期化子まで委任できません。
失敗しない初期化子は、失敗する初期化子に委任することはできません。
以下のプログラムは、フェイル可能イニシャライザーとフェイル不可イニシャライザーについて説明しています。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
初期化! Failable Initializer
Swift 4は「init?」を提供しますオプションのインスタンス失敗可能イニシャライザを定義します。 特定のタイプ「init!」の暗黙的にアンラップされたオプションのインスタンスを定義するには指定されます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
必要な初期化子
initialize 'required’キーワードの各サブクラスを宣言するには、init()関数の前に定義する必要があります。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-