Swift编程:存储属性中的getter / setter

如何覆盖Swift中存储的属性的setter?

在Obj-C中,我可以覆盖它的setter,但Swift似乎并不乐意getter / setter被用于存储属性。

假设我有一个名为rank的属性的Card类。 我不希望客户给它任何无效的值,因此,在Objective-C中,我可以覆盖setRank以便执行额外的检查。 但是Swift中的willSet似乎没有帮助,因为newValue是常量,因为setter将被循环调用,所以分配rank是没有意义的。

好。 通过阅读Swift上的苹果文档,我发现这个 :

如果您将值赋给自己的didSet观察器中的某个属性,则您分配的新值将replace刚刚设置的值。

所以你所要做的就是这样:

 var rank: Int = 0 { didSet { // Say 1000 is not good for you and 999 is the maximum you want to be stored there if rank >= 1000 { rank = 999 } } } 

你不能覆盖存储属性的get / set ,但你可以使用属性观察器willSet / didSet

 var totalSteps: Int = 0 { willSet(newTotalSteps) { println("About to set totalSteps to \(newTotalSteps)") } didSet { if totalSteps > oldValue { println("Added \(totalSteps - oldValue) steps") } } } 

默认的参数名是willSet newValuewillSet oldValue ,或者你可以自己命名为willSet(newTotalSteps)

get和set是为了计算属性(他们没有任何后台存储)。 (在我看来,关键字'VAR'在这里混淆)

  • 将调用willSet和didSet实例variables(使用didSet来覆盖任何更改)
  • 设置和获取纯粹是为了计算属性

如果你不想使用didSet,它有问题,该属性的值暂时是错误的,你应该围绕它计算属性。

 private var _foo:Int = 0 var foo:Int { get { return _foo } set { if(newValue > 999) { _foo = 999 } else { _foo = newValue } } } 

要么:

 private var _foo:Int = 0 var foo:Int { get { return _foo } set { guard newValue <= 999 else { _foo = 999 return } _foo = newValue } } 

简单的例子:

 class Shape { var sideLength: Double { get { return self.sideLength } set { // Implement the setter here. self.sideLength = newValue } } } 

完整的例子

在这个例子中检查perimeter

摘录自:苹果公司“Swift编程语言”,iBooks。 https://itun.es/us/jEUH0.l

 class EquilateralTriangle: NamedShape { var sideLength: Double = 0.0 init(sideLength: Double, name: String) { self.sideLength = sideLength super.init(name: name) numberOfSides = 3 } var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } override func simpleDescription() -> String { return "An equilateral triagle with sides of length \(sideLength)." } } var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle") triangle.perimeter triangle.perimeter = 9.9 triangle.sideLength”