[Swift]アクセス制御を理解してください!



この本は「SWIFTプログラミング」Bookを勉強した後に書いたものです.

アクセス制御


アクセス制御とは?

- 접근제어는 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능이다.
- 불필요한 접근으로 의도치 않은 결과를 초래하거나 꼭 필요한 부분만 제공을 해야하는데 전체 코드가 노출될 가능성이 있을 때 접근제어를 이용한다.

アクセスレベル

- 접근제어는 접근수준 키워드를 통해 구현할 수 있다.
- 각 타입에 특정 접근수준을 지정할 수 있고, 타입 내부의 프로퍼티, 메서드, 이니셜라이저에도 접근수준을 지정할 수 있다.
- 접근수준을 명시할 수 있는 키워드는 open, public, internal, fileprivate, private 가 있다.

オープン・アクセス・レベル

  • オープン・アクセス・レベルはオープン・アクセス・レベルより高く、クラスおよびクラスのメンバーにのみ適用されます.
  • オープン・アクセス・レベルのクラスは、クラスを定義するモジュール以外の他のモジュールから継承することができる.
  • オープン・アクセス・レベルのクラス・メンバーは、そのメンバーを定義したモジュール以外のモジュールで再定義できます.
  • クラスをオープン・アクセス・レベルとして指定することは、クラスを他のモジュールで親として使用するように設計したことを意味します.
  • 共通アクセス・レベル

  • publicキーワードを使用してアクセスレベルを指定できる要素
  • 公開アクセス・レベルは、通常、フレームワーク内で外部と接続するインタフェースを実装するために使用される.
  • 内部-内部アクセスレベル

  • 内部アクセスレベルは、基本的にすべての要素にデフォルトで指定されたデフォルトアクセスレベルです.
  • 内部アクセスレベルとして指定された要素は、ソースファイルが属する任意のモジュールで使用できます.
  • 外部モジュールからモジュールを取得できません.
  • 通常は外部で使用されるクラスまたは構造ではありません.モジュール内で広域で使用される場合は、内部アクセスレベルを指定します.
  • internalは基本アクセスレベルであり、タグは必要ありません.
  • fileprivate-ファイル外部専用アクセスレベル

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

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

  • 画像ソース:https://dev-jiwon.github.io/swift-grammar-13/

    アクセス制御実施上の注意事項

  • 子要素は、親要素よりも高いアクセスレベルを持つことはできません.
  • アクセス・レベルとして指定されたタイプの関数のパラメータが渡されたり、返されたりした場合、関数のアクセス・レベルはそのタイプより高いアクセス・レベルに設定できません.
  • フレームワークを作成する場合は、APIとして使用する機能を公開アクセスレベルとして指定し、他のモジュールが特定の機能にアクセスできるようにする必要があります.
  • 列挙内部の各インスタンスは個別のアクセス・レベルを提供することができず、各インスタンスのアクセス・レベルは列挙自体のアクセス・レベルに従う.
  • private class AClass {
    	//AClass의 접근 수준이 비공개 접근수준이므로 이 메서드의 접근수준도 비공개 접근수준으로 취급
    	public func someMethod() {
    			// ...
    	}
    }
    
    //AClass의 접근수준이 비공개 접근수준이므로 공개 접근수준 함수의 매개변수나 반환 값 타입으로 사용할 수 없음
    public func someFunction(a: AClass) -> AClass {
    		return a    
    }
    //오류 발생

    読み取り専用インプリメンテーション

  • は値を取得できますが、変更できない値を実装するには、設定者をより低いアクセスレベルに制限するだけです.
  • エレメントのアクセスレベルキーワードの後にアクセスレベル(set)と表示されている場合は、設定者のみのアクセスレベルを低く指定できます.
  • セットアップ・アクセス・レベル制限は、プロセス、サブスクリプト、および変数に適用でき、要素のアクセス・レベルと同じまたはそれ以下のレベルに制限する必要があります.
  • public struct SomeType {
        private var count: Int = 0
        
        public var publicStoredProperty: Int = 0
        
        //설정자는 비공개 접근수준
        public private(set) var publicGetOnlyStoredProperty: Int = 0
        
        internal var internalComputedProperty: Int {
            get {
                return count
            }
            
            set {
                count += 1
            }
        }
        
        //설정자는 비공개 접근수준
        internal private(set) var internalGetOnlyComputedProperty: Int {
            get {
                return count
            }
            
            set {
                count += 1
            }
        }
    }
    
    var someInstance: SomeType = SomeType()
    
    print(someInstance.publicStoredProperty)    //0
    someInstance.publicStoredProperty = 100
    
    print(someInstance.publicGetOnlyStoredProperty)     //0
    //someInstance.publicGetOnlyStoredProperty = 100    //오류 발생
    
    print(someInstance.internalComputedProperty)    //0
    someInstance.internalComputedProperty = 100
    
    print(someInstance.internalGetOnlyComputedProperty)     //1
    //someInstance.internalGetOnlyComputedProperty = 100    //오류 발생