SWIFT基本-アクセス制限


アクセス制御の制限
アクセス制限者は、他のソースファイルまたはモジュールコードの一部へのアクセスを制限します.
この機能を使用すると、コードの詳細な実装を非表示にし、コードにアクセスして使用するデフォルトのインタフェースを指定できます.
私たちのコードの詳細な実装が隠されているため、オブジェクト向けの隠匿化が可能になります!
🤔 モジュールとソースファイルは何ですか?
SWIFTはモジュールとソースファイルに基づいてアクセス制限を設計した.
そのモジュールとソースファイルが何なのか知っていますか?

  • モジュール
    モジュールはコードのセットです.
    フレームワーク、ライブラリ、およびアプリケーションはモジュールの一部です.
    より簡単に言えば、SWIFTのimportキーワードを使用して他のモジュールからインポートしたフレームワークやアプリケーションを考慮することができます.
    importで使用しているライブラリはすべてモジュールです

  • ソースファイル
    ソースファイルはモジュールよりも分かりやすいです.
    ソースファイルは.swiftファイルの単位.
    アプリケーションまたはフレームワーク内の単一ファイルswiftソースファイルを考慮できます.
  • 🤔 隠匿化って何?
    TheSwift Programming Languageによる隠匿化にはこのような意味がある
    オブジェクトの外部からオブジェクト内のデータにアクセスし、変更および操作する操作を制限するには、内部アクセス(getter)および設定(setter)の方法でのみ結果を得ることができます.外部は内部活動を知らないし、データの値や変化も知らない. データにアクセスできるのは、メソッド(setter、getter)のみです.
    要するに,別のソースファイルやモジュールのコードでは,ブロックコードの一部を非表示化と呼ぶ.
    アクセス指定者は、他のユーザーが使用する必要がある情報しか表示できないように隠匿できます.
    🤔 アクセス制限者はどこで使用できますか?
    アクセス制限子は、クラス、構造、列挙などの個別のタイプ、およびそのタイプに属するProperty、メソッド、および頭文字Riserに使用できます.
    プロトコルの場合、グローバル定数、変数、関数など、特定のコンテキストに制限できます.
    ➰ Access Levels
    🔓 public, open
    public、openアクセスを使用すると、エンティティを定義するモジュールのすべてのソースファイルで使用したり、定義されたモジュールをインポートした他のモジュールのソースファイルで使用したりできます.通常、フレームワークに共通インタフェースを指定する場合、publicおよびopenアクセスが使用されます.

  • public
    どこでも使用できるアクセス・レベルを指定します.
    外部継承はできません.classメンバーを上書きすることはできません.
    定義されたモジュール内でのみサブ通信が可能です.(Open以外のすべてのアクセスは同じです)
    class、classメンバーは、定義されたモジュール内でのみサブ通信または上書きできます.
    Framework内部のみsubclassing

  • open
    公衆よりも開放的な接近レベルがある.
    classおよびclassメンバーのみ使用可能
    クラスをモジュール外で継承し、クラスのメンバーをモジュール外で再定義できるようにします.
    どこでもsubclassingができます.
    class、classメンバーは、定義されたモジュール内であってもよいし、インポートモジュールの外部モジュールでサブ通信または上書きを行ってもよい.
    Framework内部、Framework外部のどこでもサブ通信が可能です.
  • クラスはopenであってもよく、明示的にopenとマークされている場合は、superclassとしてクラスを使用する他のモジュールでインポートされたコードの影響を考慮したため、クラスコードの設計が適切であることを示します.
    🔐 internal
    内部アクセスは、モジュールで定義されたエンティティのすべてのソースファイルで使用されますが、モジュールの外部のソースファイルでは使用されません.通常、appまたはframeworkの内部構造を定義するときに内部アクセスが使用されます.
    デフォルトでは、内部はすべての要素にデフォルトで指定されたアクセス・レベルであり、アクセス制限が宣言されていない場合は内部アクセス・レベルがあります.
    内部は、同じモジュール内で継承、再定義、および使用できます.ただし、モジュールの外部にはアクセスできません.
    つまり、内部は定義されたモジュール内でのみ使用されます!このような意味を持つアクセス制限者です.
    🔒 fileprivate, private
    fileprivateアクセスにより、ファイル全体で詳細を使用するときに特定の機能の実装詳細を非表示にできます.privateアクセスは、特定の機能ブロック(単一定義でのみ使用)の実装詳細を非表示にすることができる.

  • fileprivate
    同じファイルでEXCESSができます.
    同じソースコード内で継承、再定義、および使用できるようにします.
    swift言語が.swiftファイルで複数のタイプのプロパティを宣言できることを考慮したアクセス制限者です.
    ファイル全体にわたって特定の機能の詳細な実装情報を非表示にします.

  • private
    同じ顕微鏡の下でしかアクセスできません.
    同じタイプでしか使用できませんが、他の状況では近づけません.
    同じタイプ内でステータスまたは情報を非表示にする場合に使用します.
    swift 4以降は、同じソースファイルの拡張でprivateを使用することもできます.
  •     private class PrivateClass{
            public init() {}
            private var name = "HI"
        }
    
        extension PrivateClass{
            func someMethod(){
                print(name)//OK
            }
        }
    完璧なオブジェクト向けを追求する場合はprivate、getter、setterを使用することが望ましい.
    🔏 隠匿度
    (制限)openすべてのタイプに適用されるアクセス指定子ルールには、次のものがあります. 「子要素は親要素より高いアクセスレベルを持つことはできません.」 .
    たとえば、
    privateとして宣言されたクラスにpublic propertyまたは関数を持つことはできません.
    パラメータまたは戻り値は、関数のアクセス指定子以上でなければなりません.
    元の値を列挙するタイプは、列挙自体のアクセスレベルよりも高い必要があります.
    🕰 アクセス制限はいつ使用しますか?
    主にライブラリまたはフレームワークの作成に使用されます.
    ライブラリとフレームワークは外部で使用されるモジュールであるためです.
    私たちは一般的にアプリケーションを作るときに使う必要はありません.
    私たちが書いたソースコード自体は外部で使用されないからです!
    アクセス制限を特に指定する必要はなく、ソースコードを記述する必要もありませんが、アプリケーション自体が他のコードから実装の詳細を非表示にしたい場合はfileprivateまたはprivateを使用します.
    異なるレベルのアクセス制御に加えて、swiftは従来のスキームの基本アクセスレベルを提供し、アクセス制御レベルを明確に指定する必要を低減します.したがって、単一のターゲット・アプリケーションを作成する場合は、明示的なアクセス制限を指定する必要はありません.
    ➰ reference
    Access Control - The Swift Programming Language (Swift 5.5)