为具有已定义的getter和setter的属性设置默认值

JuJ*_*oDi 20 properties swift

我有一个非常简单的课程

class SimpleClass {
    var simpleDescription: String {
    get {
        return self.simpleDescription
    }
    set {
        self.simpleDescription = newValue
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

定义simpleDescription变量默认值的正确方法是什么?

GoZ*_*ner 22

在Swift中,getter和setter用于计算属性 - 属性没有存储空间,因此,在您的情况下,simpleDescription不能在setter中设置.

如果您需要默认值,请使用:

class SimpleClass {
  var simpleDescription: String = "default description"
}
Run Code Online (Sandbox Code Playgroud)

如果你想初始化使用:

class SimpleClass {
  var simpleDescription: String
  init (desc: String) {
    simpleDescription = desc
  }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*k E 16

如果您想要的是每次设置变量时执行操作或只是为了检查值是否正确,您可以使用Property Observers
From docs:

财产观察员观察并回应财产价值的变化.每次设置属性值时都会调用属性观察者,即使新值与属性的当前值相同.

您可以像这样使用它们:

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

在重写继承的属性时,这看起来不起作用.这是一个你不能做的例子:

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")
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)