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
は最低(最も制限が多い) open
とpublic
の違いはmoduleを越えてsubclass化とoverrideできるかどうか- エンティティは より低い(より制限的な)他のエンティティが出てくるようなやつは 定義できない
public
な変数は、internal
やfileprivate
,privte
な型で定義できない- 関数は、パラメータや返り値の型より高いアクセスレベルにできない
- デフォルトのアクセスレベルは
internal
- 多くの場合、コードに明示的なアクセスレベルを指定する必要はありません。
- 単純な単一ターゲットアプリを書く場合は、
internal
で充分要件を満たしている - フレームワーク開発では APIを
open
かpublic
にする - 単体テスト可能なのは
open
かpublic
だけどinternal
なのをテストしたいなら@testable
アトリビュートを付ける - 型のアクセスレベルは、メンバーの暗黙のアクセスレベルになる
- privateかfileprivateにすると、メンバーの暗黙のアクセスレベルはprivateかfileprivateになる
- internalかpublicにすると、メンバーの暗黙のアクセスレベルはinternalになる
- タプルのアクセスレベルは、中身から最も低いアクセスレベルのやつになる
- 関数の暗黙のアクセスレベルは、パラメータと返り値型のなかから最も低いやつになる
- 列挙型の個々の
case
は、列挙型のレベルと同じになる。個々のcase
に異なるレベルはつけられない - 列挙型のrawValueと 関連付けられた値は、列挙型と同じか高いアクセスレベルでなければならない
- ネストされた型の暗黙のレベル
private
型にネストされた型は、private
fileprivate
型にネストされた型は、private
public
かinternal
型にネストされた型は、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だよね〜と言われたので、とりあえず全て無指定で生きて行こうと思うの。