カスタム型に対して明示的なアクセスレベルを指定したい場合には、型を定義する時点で指定します。アクセスレベルが許可する場所であれば、その新しい型を使用することができます。例えば、private クラスを定義する場合、その private クラスが定義されているソースファイル内で、プロパティの型や、関数のパラメータや戻り値の型としてのみ、そのクラスを使用することができます。

また、型のアクセス制御レベルは、その型のメンバ(プロパティ、メソッド、イニシャライザ、サブスクリプト)のデフォルトアクセスレベルにも影響があります。型のアクセスレベルを private として定義した場合、そのメンバのデフォルトアクセスレベルもまた private になります。型のアクセスレベルを internal または public として定義(あるいはアクセスレベルを明示的に指定せずにデフォルトアクセスレベルの internal を使用)した場合には、その型のメンバのデフォルトアクセスレベルは internal になります。

NOTE
上述のように、public の型は public のメンバではなく、internal のメンバを持ちます。型のメンバを public にしたい場合には、明示的にそう指定する必要があります。この要件により、公開する型の API を選択でき、型の内部処理を誤って public として公開してしまうことを防ぐことができます。
public class SomePublicClass {          // 明示的な public クラス
    public var somePublicProperty = 0    // 明示的な public クラスメンバ
    var someInternalProperty = 0         // 暗黙的な internal クラスメンバ
    private func somePrivateMethod() {}  // 明示的な private クラスメンバ
}

class SomeInternalClass {               // 暗黙的な internal クラス
    var someInternalProperty = 0         // 暗黙的な internal クラスメンバ
    private func somePrivateMethod() {}  // 明示的な private クラスメンバ
}

private class SomePrivateClass {        // 明示的な private クラス
    var somePrivateProperty = 0          // 暗黙的な private クラスメンバ
    func somePrivateMethod() {}          // 暗黙的な private クラスメンバ
}

タプル型

タプル型のアクセスレベルは、そのタプルで使用されているすべての型で最も制限されているアクセスレベルになります。例えば、タプルを 2 つの異なる型、1 つを internal アクセス、もう 1 つを private アクセスで構成した場合、そのタプル型のアクセスレベルは private になります。

NOTE
タプル型には、クラス、構造体、列挙型、関数にあるスタンドアロンの定義がありません。タプル型のアクセスレベルは、使用されるときに自動的に推論され、明示的に指定することができません。

関数型

関数型のアクセスレベルは、関数のパラメータ型や戻り値の型で最も制限されているアクセスレベルに算定されます。算定された関数のアクセスレベルが文脈上のデフォルトにマッチしない場合には、関数の定義の一部として明示的にアクセスレベルを指定する必要があります。

次の例では、グローバル関数 someFunction を定義し、関数自体にはアクセスレベルを指定していません。この関数がデフォルトアクセスレベルの internal になると期待するかもしれませんが、このケースではそうなりません。実際、someFunction はコンパイルされません。

func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // 関数の実装
}

関数の戻り値の型は、Custom Types で定義した 2 つの型で構成されたタプル型です。クラスの一方は internal として定義され、他方は private として定義されています。従って、タプル型全体のアクセスレベルは private(タプルを構成する型の最低のアクセスレベル)になります。

関数の戻り値の型が private であるため、関数宣言を有効にするには、private を関数の全体のアクセスレベルに付ける必要があります。

private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
    // 関数の実装
}

関数の戻り値の型に private のクラスがあるため、someFunction の定義に public や internal を付けることや、デフォルト設定の internal を使用することはできません。

列挙型

列挙型の個々のケースは、属している列挙型と同じアクセスレベルになります。個々の列挙型のケースに対して、異なるアクセスレベルを指定することはできません。

次の例では、列挙型 CompassPoint に明示的なアクセスレベルの public を付けています。従って、列挙型のケース NorthSouthEastWest のアクセスレベルもまた public になります。

public enum CompassPoint {
    case North
    case South
    case East
    case West
}

raw 値と関連値

列挙型の定義にある raw 値や関連値の型は、少なくとも列挙型のアクセスレベルと同じ高さのアクセスレベルになります。例えば、internal アクセスレベルである列挙型の raw 値の型に、private の型を使用することはできません。

ネストされた型

private の型にネストされた型は、自動的に private のアクセスレベルになります。public や internal の型にネストされた型は、自動的に internal のアクセスレベルになります。public の型にネストされた型を public にしたい場合には、ネストされた型を明示的に public として宣言する必要があります。


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.