通过这个简单的类,我得到了编译器警告
试图在自己的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中修改其他属性,这就是它们的意义所在。
setter和getter应用于计算属性;这样的属性在实例中没有存储空间——getter中的值将从其他实例属性中计算出来。在你的例子中,没有x被赋值。
显式地:“在没有显式支持ivars的情况下如何做到这一点”。您不能这样做—您需要备份计算的属性。试试这个:
class Point {
private var _x: Int = 0 // _x -> backingX
var x: Int {
set { _x = 2 * newValue }
get { return _x / 2 }
}
}
具体来说,在Swift REPL中:
15> var pt = Point()
pt: Point = {
_x = 0
}
16> pt.x = 10
17> pt
$R3: Point = {
_x = 20
}
18> pt.x
$R4: Int = 10