web-dev-qa-db-ja.com

ゲッターとセッターが定義されたプロパティのデフォルト値を設定する

私は非常に単純なクラスを持っています

class SimpleClass {
    var simpleDescription: String {
    get {
        return self.simpleDescription
    }
    set {
        self.simpleDescription = newValue
    }
    }
}

simpleDescription変数のデフォルト値を定義する正しい方法は何ですか?

20
JuJoDi

Swiftでは、ゲッターとセッターは計算されたプロパティに使用されます-プロパティのストレージがないため、あなたの場合、simpleDescriptionをセッターに設定することはできません。

デフォルト値が必要な場合は、次を使用します。

class SimpleClass {
  var simpleDescription: String = "default description"
}

使用を初期化する場合:

class SimpleClass {
  var simpleDescription: String
  init (desc: String) {
    simpleDescription = desc
  }
}
22
GoZoner

変数が設定されるたびにアクションを実行するか、値が正しいかどうかを確認するだけの場合は、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")
            }
        }
    }
16
Mark E

単純な値を直接設定する:

var string1: String = "value" {
    willSet {
        print("willSet")
    }
    didSet {
        print("didSet")
    }
}

計算されたクロージャの結果を設定する:

var string2: String = {
        let value = "value"
        return value
    }() {
    willSet {
        print("willSet")
    }
    didSet {
        print("didSet")
    }
}
1
pkamb

解決策は簡単です。別の変数を使用して、ゲッターに戻します。

var _simpleDescription = "Default value"

var simpleDescription: String {
    get {
        return self._simpleDescription
    }
    set {
        self.simpleDescription = newValue
    }
}
1
Boomerange