定数や変数、プロパティを、その型よりもアクセスできるようにすることはできません。例えば、private の型を public のプロパティで記述することはできません。同様に、サブスクリプトを、そのインデックスの型や戻り値の型よりもアクセスできるようにすることはできません。

定数、変数、プロパティ、サブスクリプトで private の型を使用する場合、定数、変数、プロパティ、サブスクリプトについても private にする必要があります。

private var privateInstance = SomePrivateClass()

getter と setter

定数、変数、プロパティ、サブスクリプトに対する getter と setter は、自動的に属する定数、変数、プロパティ、サブスクリプトと同じアクセスレベルになります。

変数、プロパティ、サブスクリプトの読み書き範囲を制限するために、getter よりも低いアクセスレベルを setter に与えることができます。var や subscript の前に private(set) や internal(set) を記述して、より低いアクセスレベルを指定します。

NOTE
このルールは、ストアドプロパティにもコンピューテッドプロパティにも適用されます。ストアドプロパティに明示的な getter と setter を記述していない場合でも、ストアドプロパティのバッキングストレージにアクセスするために、Swift は暗黙の getter と setter を合成します。コンピューテッドプロパティでの明示的な setter とまったく同じようにして、この合成された setter のアクセスレベルを変更するために private(set) と internal(set) を使用します。

次の例では、文字列プロパティが変更された回数を記録する構造体 TrackedString を定義していします。

struct TrackedString {
    private(set) var numberOfEdits = 0
    var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
}

構造体 TrackedString は文字列のストアドプロパティ value を、初期値 ""(空文字列)で定義しています。また、value が変更された回数を記録するために使用される、整数のストアドプロパティ numberOfEditsを定義しています。この変更記録は、value プロパティに対する didSet プロパティオブザーバで実装されていて、value プロパティに新しい値が設定されるたびに numberOfEdits を加算します。

構造体 TrackedString と value プロパティには明示的なアクセスレベルの指定が無いため、ともにデフォルトアクセスレベルの internal になります。しかしながら、numberOfEdits プロパティのアクセスレベルには、構造体 TrackedString の定義と同じソースファイル内からのみ設定できるプロパティであることを示すために、private(set) が付けられています。プロパティの getter はデフォルトアクセスレベルの internal のままですが、setter は TrackedString が定義されているソースファイルで private になります。これにより、TrackedString が numberOfEdits プロパティを内部的に変更しますが、同じモジュール内にある別のソースファイルによって使用されるときには読み取り専用のプロパティになります。

TrackedString のインスタンスを生成し、その文字列の値を何回か変更すると、変更回数に一致する numberOfEdits プロパティ値に更新されることを確認できます。

var stringToEdit = TrackedString()
stringToEdit.value = "This string will be tracked."
stringToEdit.value += " This edit will increment numberOfEdits."
stringToEdit.value += " So will this one."
print("The number of edits is \(stringToEdit.numberOfEdits)")
// "The number of edits is 3" と出力

別のソースファイルから numberOfEdits プロパティの現在値を問い合わせることはできますが、別のソースファイルからプロパティを変更することはできません。TrackedString 編集記録機能のアスペクトに便利なアクセスを提供する一方で、この制限によって機能の実装の詳細を保護しています。

必要であれば、getter と setter の両方に明示的なアクセスレベルを指定できることに注目してください。次の例では、構造体 TrackedString が明示的なアクセスレベル public で定義されています。従って、構造体の(numberOfEdits プロパティを含む)メンバはデフォルトで internal アクセスレベルになります。public と private(set) のアクセスレベルの指定を組み合わせて、構造体の numberOfEdits プロパティの getter を public にし、そのプロパティの setter を private にすることができます。

public struct TrackedString {
    public private(set) var numberOfEdits = 0
    public var value: String = "" {
        didSet {
            numberOfEdits += 1
        }
    }
    public init() {}
}

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.