通过这个简单的类,我得到了编译器警告
试图在自己的setter/getter中修改/访问x
当我这样使用它时:
var p: point = Point()
p.x = 12
我得到一个EXC_BAD_ACCESS。我怎么能做到这一点没有显式支持变量?
class Point {
var x: Int {
set {
x = newValue * 2 //Error
}
get {
return x / 2 //Error
}
}
// ...
}
Swift中的setter /getter与ObjC有很大不同。属性变成一个计算属性,这意味着它不像在ObjC中那样有一个支持变量,比如_x。
在下面的解决方案代码中,您可以看到xTimesTwo不存储任何东西,而是简单地计算x的结果。
请参阅有关计算属性的官方文档。
您想要的功能也可能是Property observer。
你需要的是:
var x: Int
var xTimesTwo: Int {
set {
x = newValue / 2
}
get {
return x * 2
}
}
您可以在setter/getter中修改其他属性,这就是它们的意义所在。
更新:Swift 4
在下面的类setter和getter应用于变量sideLength
class Triangle: {
var sideLength: Double = 0.0
init(sideLength: Double, name: String) { //initializer method
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter: Double {
get { // getter
return 3.0 * sideLength
}
set(newValue) { //setter
sideLength = newValue / 4.0
}
}
创建对象
var triangle = Triangle(sideLength: 3.9, name: "a triangle")
Getter
print(triangle.perimeter) // invoking getter
把
triangle.perimeter = 9.9 // invoking setter