Swift には、コード内のエンティティに対する 3 つの異なるアクセスレベルがあります。これらのアクセスレベルは、エンティティが定義されているソースファイルに対応し、またソースファイルが属するモジュールに対応します。

  • public アクセスは、エンティティを定義したモジュールのソースファイルでも、定義したモジュールをインポートした別のモジュールのソースファイルでも、エンティティを使用できるようにします。一般的には、フレームワークに公開インタフェースを指定するときに、public アクセスを使用します。
  • internal アクセスは、エンティティを定義したモジュールのソースファイル内でエンティティを使用できるようにしますが、そのモジュール外にあるソースファイルでは使用できません。一般的には、アプリまたはフレームワークの内部構造を定義するときに、internal アクセスを使用します。
  • private アクセスは、エンティティの使用をそれ自体を定義しているソースファイルに制限します。特定機能の実装の詳細を隠すときに、private アクセスを使用します。

public アクセスが最高(最低制限)のアクセスレベルで、private アクセスが最低(最高制限)のアクセスレベルです。

NOTE
Swift の private アクセスは、他の多くの言語での private アクセスとは異なり、宣言ではなくソースファイルでのスコープになります。つまり、型は同じソースファイルに定義されている private エンティティにアクセスできますが、別のソースファイルで定義されたエクステンションは型の private メンバにアクセスできません。

アクセスレベルの指針

Swift のアクセスレベルは、全般的な指針である「より低い(より制限された)アクセスレベルを持つ別のエンティティという観点からエンティティを定義することはできない。」に従います。

例を示します。

  • public 変数が使用される場所で internal や private な型が利用可能でないことがあるため、internal や private な型を持つ public 変数を定義することはできません。
  • ある関数の構成要素の型が周りのコードで利用可能でない状況で、その関数が使用されることがありえるため、関数はそのパラメータ型や戻り値の型よりも高いアクセスレベルを持つことができません。

言語の別のアスペクトに対するこの指針の具体的な影響は、以降で詳細にカバーしています。

デフォルトアクセスレベル

明示的なアクセスレベルを指定していない場合、すべてのエンティティは(わずかに例外があり、後述しますが)デフォルトアクセスレベルの internal になります。結果的に、ほとんどのケースで明示的にアクセスレベルを指定する必要はありません。

ターゲットが 1 つのアプリでのアクセスレベル

ターゲットが 1 つのシンプルなアプリを記述しているときには、一般的にアプリのコードはアプリ内だけで機能し、アプリのモジュール外で利用できるようにする必要はありません。デフォルトアクセスレベルの internal は、この要件にマッチしています。そのため、アクセスレベルを指定する必要はありません。一方で、アプリのモジュール内の他のコードから実装の詳細を隠すために、コードの一部を private にしたい場合もあります。

フレームワークでのアクセスレベル

フレームワークを開発しているときには、そのフレームワークをインポートするアプリのような別のモジュールからアクセスできるように、そのフレームワークを公開インタフェースとして public にします。この公開インタフェースは、フレームワークのアプリケーションプログラミングインタフェース (API) です。

NOTE
デフォルトアクセスレベルの internal で、フレームワークの内部実装の詳細を使用することができます。また、フレームワークの内部コードの他の部分から実装の詳細を隠したい場合には、private にすることができます。フレームワークの API の一部にしたい場合には、エンティティを public にする必要があります。

ユニットテストターゲットでのアクセスレベル

ユニットテストターゲットでアプリを記述するときには、アプリのコードをテストするためにモジュールで利用できるようにする必要があります。デフォルトでは、public とされたエンティティのみ他のモジュールからアクセスできます。しかし、プロダクトモジュールに対するインポート宣言に @testable を付け、そのプロダクトモジュールをテスト可能としてコンパイルした場合には、ユニットテストターゲットはあらゆる internal エンティティにアクセスできるようになります。


Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.