アクセス制御


アクセス制御とは?


これは
  • オブジェクト向けプログラミングモードにおいて隠匿化を実現するコア機能である.
  • アクセス制御とは、コード間のインタラクション時に、ファイル間またはモジュール間のアクセスを制限できることを意味する.
  • アクセス制御により、コードの詳細な実装は、許可機能のみを使用する非表示のインタフェースを提供することができる.
  • モジュールとソースファイル


    モジュール
  • 配布するコードのバンドル単位.
  • フレームワークまたはライブラリまたはアプリケーションは、モジュールユニットであってもよい.
  • swiftはimportキーワードを使用してロードされます.
  • ソースファイル
  • は、sweetソースファイルを表します.
  • は、通常、他のプログラミング言語で1つのファイルに1つのタイプを定義しますが、sweettでは、1つのファイルに複数のタイプを定義できます.
  • アクセスレベル

  • アクセス制御は、「アクセスレベル」キーワードによって実現される.
  • のタイプ(クラス、構造体、列挙型など)ごとに特定のアクセス・レベルを指定するか、タイプ内部のProperty、Method、頭文字Riser、サブスクリプトにアクセス・レベルを指定できます.
  • open、public、internal、fileprivate、privateの5種類があります.

  • オープンアクセスレベル-open

  • より高い公開アクセスレベルは、クラスおよびクラスのメンバーでのみ使用できます.
  • クラスをオープン・アクセス・レベルとして指定することは、クラスが他のモジュールでも親として使用できるように設計され、コードが記述されていることを意味します.
  • パブリック・アクセス・レベル-public

  • はどこでも利用できます.
  • は、実装したソースファイル、ソースファイルが属するモジュール、およびこれらのモジュールをインポートおよび書き込みするモジュールなど、どこでも使用できます.
  • 公開アクセスレベルは、通常、フレームワーク内で外部と接続するインタフェースを実装するために使用される.
  • SWIFTの基本的な要素はすべて公開のレベルで体現されていると言える.
  • オープンアクセスレベルVSオープンアクセスレベル差異
  • オープン・アクセス・レベルを除き、他のすべてのアクセス・レベルのクラスは、定義されたモジュール内でのみ継承できます.
  • オープン・アクセス・レベルを除き、他のすべてのアクセス・レベルのクラス・メンバーは、メンバー定義モジュール内でのみ再定義できます.
  • オープン・アクセス・レベルのクラスは、クラスを定義したモジュール以外の他のモジュールから継承することができる.
  • オープン・アクセス・レベルのクラス・メンバーは、そのメンバーが定義されたモジュール以外の他のモジュールで再定義できます.
  • 内部アクセス・レベル-内部

  • 内部アクセスレベルは、基本的にすべての要素を暗黙的に指定する基本アクセスレベルです.
  • ソースファイルが属するモジュールは、どこでも使用できます.
  • のみがこのモジュールを使用する外部モジュールからアクセスできません.
  • は通常、外部で使用されるクラスまたは構造体ではなく、モジュール内部で広域使用を行う場合に内部アクセスレベルを指定します.
  • ファイル外部専用アクセスレベル-fileprivate

  • fileprivateとして指定された要素は、その要素を実装するソースファイルでのみ使用できます.
  • ソースファイルの外部で値を変更したり、関数を呼び出したりする場合に使用することが望ましい.
  • プライベートアクセスレベル-private

  • は最も限られた範囲です.
  • プライベート・アクセス・レベルとして指定された要素は、その機能を定義および実装する範囲内でのみ使用できます.
  • プライベート・アクセス・レベルとして指定された機能は、同じソース・ファイルで実装される他のタイプまたは機能にも使用できません.
  • fileprivate VS private

  • fileprivateアクセスレベルとして指定された要素は、同じファイル内の任意のコードからアクセスできます.
  • A.swiftソースファイルの内部にAクラス、Bクラス、C structがあり、CクラスにFilePrivateアクセスレベルのa propertyがある場合、Bクラス、C structの両方でa propertyにアクセスできます.
  • プライベートアクセスレベルとして指定された要素は、同じファイル内に異なるタイプのコードがあってもアクセスできません.
  • ですが、拡張コードが同じファイルに存在する場合はアクセスできます.
  • アクセス制御実施上の注意事項


    💡 すべてのタイプに適用されるアクセス・レベル・ルールは、「子要素は親要素よりも高いアクセス・レベルを持つことはできません」です.
  • 非公開アクセスレベルとして定義された構造体内部のpropertyは、内部レベルまたは公開レベルを持つpropertyを定義できません.
  • はまた、あるタイプが関数のパラメータとして指定され、転送または返信された場合、関数のアクセスレベルがそのタイプより高いアクセスレベルに設定できないことを示している.
  • 関数だけでなく、tupleの内部要素タイプもtupleのアクセスレベル以上であるべきである.
  • 読み取り専用インプリメンテーション

  • 構造体またはクラスを使用して、ストレージ・プロシージャの実装時に許可されたアクセス・レベルからプロシージャ値を取得できます.
  • しかし、変更できない値を実装したい場合は、どうすればいいですか?

  • 設置器具のみのアクセスレベルが低いことを制限できます.

  • 要素のアクセスレベルキーワードの後にアクセスレベル(set)として表示される場合は、設定者のアクセスレベルがより低いことしか指定できません.
    public private(set) var publicGetOnlyStoredProperty: Int = 0