Access Control

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html を読む。

  • アクセスレベルは5段階
enum AccessLevel {
    case `open`
    case `public`
    case `internal`
    case `fileprivate`
    case `private`
}
  • レベルの高低は、openが最高(最も制限が少ない)、privateは最低(最も制限が多い)
  • openpublicの違いはmoduleを越えてsubclass化とoverrideできるかどうか
  • エンティティは より低い(より制限的な)他のエンティティが出てくるようなやつは 定義できない
    • publicな変数は、internalfileprivate,privteな型で定義できない
    • 関数は、パラメータや返り値の型より高いアクセスレベルにできない
  • デフォルトのアクセスレベルはinternal
  • 多くの場合、コードに明示的なアクセスレベルを指定する必要はありません。
  • 単純な単一ターゲットアプリを書く場合は、internalで充分要件を満たしている
  • フレームワーク開発では APIopenpublicにする
  • 単体テスト可能なのは openpublicだけどinternalなのをテストしたいなら@testableアトリビュートを付ける
  • 型のアクセスレベルは、メンバーの暗黙のアクセスレベルになる
    • privateかfileprivateにすると、メンバーの暗黙のアクセスレベルはprivateかfileprivateになる
    • internalかpublicにすると、メンバーの暗黙のアクセスレベルはinternalになる
  • タプルのアクセスレベルは、中身から最も低いアクセスレベルのやつになる
  • 関数の暗黙のアクセスレベルは、パラメータと返り値型のなかから最も低いやつになる
  • 列挙型の個々のcaseは、列挙型のレベルと同じになる。個々のcaseに異なるレベルはつけられない
  • 列挙型のrawValueと 関連付けられた値は、列挙型と同じか高いアクセスレベルでなければならない
  • ネストされた型の暗黙のレベル
    • private型にネストされた型は、private
    • fileprivate型にネストされた型は、private
    • publicinternal型にネストされた型は、internal
  • サブクラスは、スーパークラスより高いレベルにできない
  • オーバーライドは、スーパークラスでのアクセスレベルより高くできる
  • 定数変数プロパティは、その値の型のレベルより高くできない
  • subscriptはインデックス型・返り値型より高くできない
  • プロパティ等のgetterとsetterの暗黙のアクセスレベルは、そのプロパティ等と同じになる
  • setterにgetterより低いアクセスレベルを与える public private(set) var x = 0
  • イニシャライザは 型の レベルより低くできる
  • required イニシャライザは型のレベルと同じでなければならない
  • デフォルトのイニシャライザの暗黙のレベルは、型のレベルと同じ(public以外)
    • public 型のデフォルトイニシャライザの暗黙のレベルは internal
  • 構造体のmemberwiseイニシャライザは、
    • メンバーのレベルのうち一番低いやつがprivateならprivate
    • メンバーのレベルのうち一番低いやつがfileprivateならfileprivate
    • それ以外は internal
  • プロトコルの各要素のアクセスレベルは、プロトコルのレベルと同じで、違えられない
  • プロトコル継承は、元のプロトコルのレベルまで持てる。高くはできない。
  • プロトコルのconformは、型のレベルよりも低く出来る
  • 型がプロトコルをconformするという文脈は、型のレベルとプロトコルのレベルの最小値
  • extension で定義したメンバーの暗黙のレベルは、元の型のものと同じ(最大internal)
  • extensionにデフォルトのレベルを指定 private extension {…}
  • extensionでプロトコルをconformする場合は extensionのレベルは指定できない。替わりにプロトコルのレベルがデフォルトのレベルになる
  • 元の型と同じソースファイルに書いたextensionから、元の型のprivateにアクセスできる

ふつうinternalだよね〜と言われたので、とりあえず全て無指定で生きて行こうと思うの。