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

时间:2014-06-03 22:04:34

标签: properties swift

我有一个非常简单的课程

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

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

4 个答案:

答案 0 :(得分:22)

在Swift中,getter和setter用于计算属性 - 该属性没有存储空间,因此,在您的情况下,simpleDescription无法设置为设定器。

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

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

如果你想初始化使用:

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

答案 1 :(得分:16)

如果您想要的是每次设置变量时执行操作或只是为了检查值是否正确,您可以使用Property Observers
 来自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")
            }
        }
    }
}

编辑

在覆盖继承的属性时,这看起来并不起作用。以下是您无法做的事情的示例:

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")
            }
        }
    }

答案 2 :(得分:1)

直接设置一个简单值:

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

设置计算闭包的结果:

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

答案 3 :(得分:1)

解决方案很简单。只需使用另一个变量,然后将其返回到getter中即可。

var _simpleDescription = "Default value"

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