定数や変数、プロパティを、その型よりもアクセスできるようにすることはできません。例えば、private の型を public のプロパティで記述することはできません。同様に、サブスクリプトを、そのインデックスの型や戻り値の型よりもアクセスできるようにすることはできません。
定数、変数、プロパティ、サブスクリプトで private の型を使用する場合、定数、変数、プロパティ、サブスクリプトについても private
にする必要があります。
private var privateInstance = SomePrivateClass()
getter と setter
定数、変数、プロパティ、サブスクリプトに対する getter と setter は、自動的に属する定数、変数、プロパティ、サブスクリプトと同じアクセスレベルになります。
変数、プロパティ、サブスクリプトの読み書き範囲を制限するために、getter よりも低いアクセスレベルを setter に与えることができます。var
や subscript
の前に private(set)
や internal(set)
を記述して、より低いアクセスレベルを指定します。
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.