NOTE アクセス制御を適用できるコードの様々な側面(プロパティ、型、関数など)は、簡潔に記述するために、以下のセクションでは「エンティティ」と呼びます。
import
キーワードを使用して別のモジュールによってインポートできるフレームワークまたはアプリケーションです。open
として明示的にマークすることは、そのクラスをスーパークラスとして使用している他のモジュールからのコードの影響を考慮し、それに応じてクラスのコードを設計していることを示します。NOTE フレームワークの内部実装の詳細は、引き続きデフォルトの internal アクセスレベルを使用するか、フレームワークの内部コードを他の部分から隠したい場合は private または fileprivate としてマークすることができます。エンティティをフレームワークの API の一部にする場合にのみ、エンティティを open または public としてマークする必要があります。
@testable
属性でマークし、テストを有効にしてそのプロダクションモジュールをコンパイルすると、単体テストターゲットは任意の internal エンティティにアクセスできます。open
、public
、internal
、fileprivate
、または private
修飾子を配置して、エンティティのアクセスレベルを定義します。SomeInternalClass
と someInternalConstant
が明示的なアクセスレベル修飾子なしで記述でき、internal アクセスレベルを持つことを意味します。IMPORTANT public 型のメンバは、デフォルトで public ではなく、internal のアクセスレベルが設定されます。メンバを public にする場合は、明示的にそのようにマークする必要があります。これにより、型の API を選択的に公開することができ、型の内部動作を誤って API として公開することを回避できます。
NOTE タプル型には、クラス、構造体、列挙型、および関数のような独立した定義がありません。タプル型のアクセスレベルは、タプル型を構成する型から自動的に決定され、明示的に指定することはできません。
someFunction()
というグローバル関数を定義しています。この関数のデフォルトのアクセスレベルは「internal」だと思われるかもしれませんが、そうではありません。実際、 someFunction()
は下記の場合コンパイルできません。private
修飾子でマークする必要があります。public
または internal
修飾子で someFunction()
の定義をマークしたり、関数の public または internal ユーザが関数の戻り値の型で使用する private クラスへアクセスできない可能性があるため、internal のデフォルト設定を使用できません。CompassPoint
列挙型に public が明示的なアクセスレベルとして設定されています。したがって、列挙ケースの north
、 south
、 east
、 および west
にも public が設定されています。A
は someMethod()
と呼ばれる fileprivate メソッドを持つ public クラスです。クラス B
は A
のサブクラスで、アクセスレベルが「internal」に制限されています。それにもかかわらず、クラス B
は、someMethod()
の元の実装よりも制限の緩い「internal」のアクセスレベルで someMethod()
のオーバーライドを提供しています。A
とサブクラス B
は同じソースファイルで定義されているため、someMethod()
の B 実装で super.someMethod()
を呼び出すことは妥当です。var
または subscript
の前に fileprivate(set)
、private(set)
、または internal(set)
を記述して、より制限の厳しいアクセスレベルを割り当てます。NOTE このルールは、格納プロパティと計算プロパティにも適用されます。格納プロパティに明示的な get と set を作成しなくても、Swift は暗黙的な get と set を合成して、格納プロパティのバッキングストレージへのアクセスを提供します。fileprivate(set)
、private(set)
、およびinternal(set)
を使用して、格納プロパティの明示的な set の場合とまったく同じ方法で、合成された set のアクセスレベルを変更します。
TrackedString
という構造体を定義しています:TrackedString
構造体は、value
と呼ばれる文字列の格納プロパティを定義し、初期値は "" (空の文字列) です。この構造体は、numberOfEdits
という整数格納プロパティも定義しています。これは、値が変更された回数を追跡するために使用されています。この変更追跡は、value
プロパティに didSet
プロパティオブザーバを使用して実装され、value
プロパティに新しい値に設定される度に numberOfEdits
を増加します。TrackedString
構造体と value
プロパティは明示的なアクセスレベル修飾子を提供していないため、両方ともデフォルトの internal アクセスレベルを受け取ります。ただし、numberOfEdits
プロパティのアクセスレベルは private(set)
修飾子でマークされており、get には引き続きデフォルトのアクセスレベル internal が設定され、プロパティは TrackedString
構造体の一部のコード内からのみ設定可能だということを示しています。これにより、TrackedString
は numberOfEdits
プロパティを内部的に変更できますが、構造体の定義の外部で使用される場合は、プロパティを読み取り専用プロパティとして表示できます。TrackedString
インスタンスを作成し、その文字列値を数回変更すると、numberOfEdits
プロパティの値が変更の数に一致するように更新されていることがわかります。numberOfEdits
プロパティの現在の値へ別のソースファイルからアクセスすることはできますが、別のソースファイルからプロパティを変更することはできません。この制限により、TrackedString
編集追跡機能の実装の詳細が保護されつつ、その機能の便利な一側面へのアクセスは提供することができています。TrackedString
構造体のバージョンを示しています。したがって、構造体のメンバ(numberOfEdits
プロパティを含む) には、デフォルトで internal アクセスレベルが設定されています。public
と private(set)
のアクセスレベル修飾子を組み合わせることで、構造体の numberOfEdits
プロパティの get を public にし、その set を private にすることができます。NOTE public プロトコルを定義する場合、プロトコルの要件は、実装時にそれらの要件に対する public アクセスレベルを必要とします。この動作は、他の型のように、型の定義が public のメンバのアクセスレベルが internal に暗黙的になる動作とは異なります。
NOTE Swift では、Objective-C と同様に、プロトコル準拠はグローバルです。同じプログラム内で 2 つの異なる方法で同じ型が 1 つのプロトコルに準拠することはできません。
private
) で extension をマークして、extension 内で定義されている全てのメンバに新しいデフォルトのアクセスレベルを設定することもできます。この新しいデフォルトは、extension 内で引き続き個々の型のメンバでオーバーライドできます。NOTE この規則は、プロトコル準拠を満たすために使用される関連型のタイプエイリアスにも適用されます。