私は非常に単純なクラスを持っています
class SimpleClass {
var simpleDescription: String {
get {
return self.simpleDescription
}
set {
self.simpleDescription = newValue
}
}
}
simpleDescription
変数のデフォルト値を定義する正しい方法は何ですか?
Swiftでは、ゲッターとセッターは計算されたプロパティに使用されます-プロパティのストレージがないため、あなたの場合、simpleDescription
をセッターに設定することはできません。
デフォルト値が必要な場合は、次を使用します。
class SimpleClass {
var simpleDescription: String = "default description"
}
使用を初期化する場合:
class SimpleClass {
var simpleDescription: String
init (desc: String) {
simpleDescription = desc
}
}
変数が設定されるたびにアクションを実行するか、値が正しいかどうかを確認するだけの場合は、Property Observers
を使用できます。
ドキュメントから:
プロパティオブザーバーは、プロパティの値の変化を観察して対応します。プロパティオブザーバーは、新しい値がプロパティの現在の値と同じであっても、プロパティの値が設定されるたびに呼び出されます。
次のように使用できます。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
[〜#〜]編集[〜#〜]
継承されたプロパティをオーバーライドする場合、これは機能しないようです。これがあなたの例できないの例です:
class StepWihtoutCounter {
var totalSteps: Int = 0
}
class StepCounter: StepWihtoutCounter {
override var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
単純な値を直接設定する:
var string1: String = "value" {
willSet {
print("willSet")
}
didSet {
print("didSet")
}
}
計算されたクロージャの結果を設定する:
var string2: String = {
let value = "value"
return value
}() {
willSet {
print("willSet")
}
didSet {
print("didSet")
}
}
解決策は簡単です。別の変数を使用して、ゲッターに戻します。
var _simpleDescription = "Default value"
var simpleDescription: String {
get {
return self._simpleDescription
}
set {
self.simpleDescription = newValue
}
}