Swift-access-control
Swift-アクセス制御
コードブロック、モジュール、および抽象化へのアクセスを制限するには、アクセス制御を使用します。 クラス、構造、および列挙は、アクセス制御メカニズムによって、それらのプロパティ、メソッド、初期化子、および添え字に従ってアクセスできます。 プロトコルの定数、変数、および関数は制限されており、アクセス制御を介してグローバルおよびローカルとしてアクセスできます。 プロパティ、タイプ、機能に適用されるアクセス制御は「エンティティ」と呼ばれます。
アクセス制御モデルは、モジュールとソースファイルに基づいています。
モジュールは、コード配布の単一ユニットとして定義され、キーワード「import」を使用してインポートできます。 ソースファイルは、複数のタイプと機能にアクセスするモジュール内の単一のソースコードファイルとして定義されます。
Swift 4言語では、3つの異なるアクセスレベルが提供されます。 パブリック、内部、プライベートアクセスです。
S.No | Access Levels & Definition |
---|---|
1 |
Public 定義モジュールのソースファイル、定義モジュールをインポートする別のモジュールのソースファイルでエンティティを処理できるようにします。 |
2 |
Internal 定義モジュールのソースファイル内でエンティティを使用できるようにしますが、そのモジュール外のソースファイルでは使用できません。 |
3 |
Private エンティティの使用を独自の定義ソースファイルに制限します。 プライベートアクセスは、特定のコード機能の実装の詳細を隠す役割を果たします。 |
構文
機能タイプのアクセス制御
一部の関数は、戻り値なしで関数内で宣言された引数を持つ場合があります。 次のプログラムは、sum()関数の引数としてaとbを宣言します。 関数自体の内部で、引数aおよびbの値は、関数呼び出しsum()を呼び出すことによって渡され、その値が出力されるため、戻り値が削除されます。 関数の戻り値の型をprivateにするには、private修飾子を使用して関数の全体的なアクセスレベルを宣言します。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
列挙型のアクセス制御
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
Swift 4言語の列挙は、列挙の個々のケースに対して同じアクセスレベルを自動的に受け取ります。 たとえば、3つのサブジェクトで保護されている学生の名前とマークにアクセスするとします。列挙名はstudentとして宣言され、enumクラスに存在するメンバーは文字列データ型に属する名前です。 生徒の名前または採点したマークにアクセスするため。 現在、switch caseは、そのcaseブロックが実行された場合、学生名を印刷します。そうでない場合、学生によって保護されたマークを印刷します。 両方の条件が満たされない場合、デフォルトのブロックが実行されます。
サブクラスのアクセス制御
Swift 4では、ユーザーは現在のアクセスコンテキストでアクセスできるクラスをサブクラス化できます。 サブクラスは、スーパークラスよりも高いアクセスレベルを持つことはできません。 ユーザーは、内部スーパークラスのパブリックサブクラスの作成を制限されています。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
定数、変数、プロパティ、添え字のアクセス制御
Swift 4の定数、変数、またはプロパティは、その型よりもパブリックとして定義できません。 プライベートタイプでパブリックプロパティを記述することは無効です。 同様に、添え字は、そのインデックスまたは戻り値の型よりもパブリックにすることはできません。
定数、変数、プロパティ、または添え字がプライベートタイプを使用する場合、定数、変数、プロパティ、または添え字もプライベートとしてマークする必要があります-
ゲッターとセッター
定数、変数、プロパティ、およびサブスクリプトのゲッターとセッターは、それらが属する定数、変数、プロパティ、またはサブスクリプトと同じアクセスレベルを自動的に受け取ります。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
初期化子とデフォルトの初期化子のアクセス制御
カスタム初期化子には、初期化するタイプ以下のアクセスレベルを割り当てることができます。 必要なイニシャライザは、所属するクラスと同じアクセスレベルを持っている必要があります。 初期化子のパラメータの型は、初期化子自身のアクセスレベルよりもプライベートにすることはできません。
initialize 'required’キーワードの各サブクラスを宣言するには、init()関数の前に定義する必要があります。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
デフォルトの初期化子は、その型がパブリックとして定義されていない限り、初期化する型と同じアクセスレベルを持ちます。 デフォルトの初期化がパブリックとして定義されている場合、内部と見なされます。 ユーザーが別のモジュールの引数なしの初期化子を使用して初期化できるパブリック型を必要とする場合は、パブリック引数なしの初期化子を型の定義の一部として明示的に指定します。
プロトコルのアクセス制御
既存のプロトコルから機能を継承するために新しいプロトコルを定義する場合、互いのプロパティを継承するために、両方に同じアクセスレベルを宣言する必要があります。 Swift 4のアクセス制御では、ユーザーは「内部」プロトコルを継承する「パブリック」プロトコルを定義できません。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
拡張機能のアクセス制御
Swift 4では、ユーザーが拡張機能を使用してプロトコル準拠を追加する場合、拡張機能に明示的なアクセスレベル修飾子を提供することはできません。 拡張内の各プロトコル要件実装のデフォルトのアクセスレベルには、独自のプロトコルアクセスレベルが用意されています。
ジェネリックのアクセス制御
ジェネリックを使用すると、ユーザーは型パラメーターの型制約にアクセスするための最小アクセスレベルを指定できます。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
タイプエイリアスのアクセス制御
ユーザーは、タイプエイリアスを定義して、異なるアクセス制御タイプを処理できます。 ユーザーは、同じアクセスレベルまたは異なるアクセスレベルを定義できます。 型エイリアスが「private」の場合、関連付けられているメンバーは「private、internal of public type」として宣言できます。 型エイリアスがパブリックの場合、メンバーは「内部」または「プライベート」名としてエイリアスにすることはできません
定義するすべてのタイプエイリアスは、アクセス制御の目的で特殊タイプとして扱われます。 タイプエイリアスのアクセスレベルは、エイリアスを設定するタイプのアクセスレベル以下にすることができます。 たとえば、プライベートタイプエイリアスはプライベート、内部、またはパブリックタイプをエイリアスできますが、パブリックタイプエイリアスは内部またはプライベートタイプをエイリアスできません。
プレイグラウンドを使用して上記のプログラムを実行すると、次の結果が得られます-
迅速なエンコードとデコード
Swift 4には新しい Codable プロトコルが導入されており、特別なコードを記述することなく、値の型を失うことを心配することなく、カスタムデータ型をシリアル化および非シリアル化できます。
LangauageはCodable Protocolに準拠していることに注意してください。 次に、簡単な1行を使用して、Json Data Representationに変換します。
Swiftは、データ型内のすべての値を自動的にエンコードします。
次のようなデコーダー機能を使用してデータをデコードできます
JSONEncoderとそれに対応するプロパティリストPropertyListEncoderの両方には、それらの動作をカスタマイズするための多くのオプションがあります。