Swift-protocols
Swift-プロトコル
プロトコルは、メソッド、プロパティ、およびその他の要件機能の青写真を提供します。 実装ではなく、メソッドまたはプロパティのスケルトンとして記述されています。 メソッドとプロパティの実装は、クラス、関数、列挙を定義することでさらに実行できます。 プロトコルの適合性は、プロトコルの要件を満たすメソッドまたはプロパティとして定義されます。
構文
プロトコルも、クラス、構造、および列挙の構文と同様の構文に従います-
プロトコルは、クラス、構造、または列挙型の名前の後に宣言されます。 単一および複数のプロトコル宣言も可能です。 複数のプロトコルが定義されている場合、コンマで区切る必要があります。
スーパークラスにプロトコルを定義する必要がある場合、プロトコル名はスーパークラス名の後にカンマを付けてください。
プロパティとメソッドの要件
プロトコルは、特定のクラスタイププロパティまたはインスタンスプロパティを指定するために使用されます。 格納されたプロパティであるか計算されたプロパティであるかを指定するのではなく、タイプまたはインスタンスのプロパティのみを指定します。 また、プロパティが「gettable」か「settable」かを指定するために使用されます。
プロパティ要件は、プロパティ変数として「var」キーワードによって宣言されます。 \ {get set}は、型宣言後にgettableおよびsettableプロパティを宣言するために使用されます。 Gettableは、型宣言の後に\ {get}プロパティによって言及されます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
変更メソッドの要件
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
初期化子の要件
Swingを使用すると、ユーザーはプロトコルを初期化して、通常の初期化子と同様の型の準拠に従うことができます。
構文
例えば
プロトコル初期化子要件のクラス実装
指定されたまたは便利な初期化子により、ユーザーは予約された「必須」キーワードによってプロトコルを初期化して標準に準拠させることができます。
プロトコルの適合性は、「必須」修飾子によって明示的または継承された実装のすべてのサブクラスで保証されます。
サブクラスがスーパークラスの初期化要件をオーバーライドする場合、「override」修飾子キーワードで指定されます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
タイプとしてのプロトコル
プロトコルに機能を実装する代わりに、それらは関数、クラス、メソッドなどの型として使用されます。
プロトコルは、次のタイプとしてアクセスできます-
- 関数、メソッド、またはパラメーターまたは戻り値の型として初期化
- 定数、変数またはプロパティ
- 配列としての辞書、辞書、またはその他のコンテナ
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
拡張機能によるプロトコル適合性の追加
拡張を利用することにより、既存のタイプを採用して新しいプロトコルに適合させることができます。 拡張機能を使用して、既存のタイプに新しいプロパティ、メソッド、および添え字を追加できます。
プロトコル継承
Swift 4では、プロトコルは定義されたプロパティからプロパティを継承できます。 クラスの継承と似ていますが、複数の継承されたプロトコルをコンマで区切ってリストすることを選択します。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
クラスのみのプロトコル
プロトコルが定義されており、ユーザーがクラスでプロトコルを定義する場合、最初にクラスを定義し、その後にプロトコルの継承リストを追加して追加する必要があります。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
プロトコル構成
Swift 4では、プロトコル構成の助けを借りて、複数のプロトコルを一度に呼び出すことができます。
構文
例
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
プロトコル適合性の確認
プロトコルの適合性は、型キャストと同様の「is」および「as」演算子によってテストされます。
- is演算子は、インスタンスがプロトコル標準に準拠している場合はtrueを返し、失敗した場合はfalseを返します。
- ダウンキャスト演算子の* as?*バージョンは、プロトコルのタイプのオプション値を返します。インスタンスがそのプロトコルに準拠していない場合、この値はnilです。 *ダウンキャスト演算子のasバージョンは、ダウンキャストをプロトコルタイプに強制し、ダウンキャストが成功しない場合、ランタイムエラーをトリガーします。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-