1.抛出问题
修改某属性值后做一些业务逻辑,在oc中会用到setter方法。那swift的setter方法中是否实现起来一样呢?答案是否定的,根据oc的写法直接这样写它会运行时死循环。报错信息:
Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeec9f2ff8)
下面两种形式都会报上面的错
set {
isWriteArray = newValue
// self.isWriteArray = newValue
}
2.解决问题
swift不能像oc一样直接在setter方法中访问成员变量,或者说swift定义属性的时候不会自动生成一个以下划线加属性名命名的成员变量。①
swift中可以用一个中间变量来实现:
class someClass: NSObject {
private static var _isWriteArray: Bool = false
static var isWriteArray: Bool {
get {
return _isWriteArray
}
set {
_isWriteArray = newValue
print("isWriteArray: \(isWriteArray), _isWriteArray: \(_isWriteArray)")
// 控制台打印:isWriteArray: true, _isWriteArray: true
// 添加业务逻辑代码
// ...
}
}
}
程序跑到setter方法中的_isWriteArray = newValue
时候会调用getter方法,这样顺利通过中间变量吧newValue赋值给我们的属性。
①这话有待考证,目前测试的情况是这样的。swift4.1.2版本。(有哪位知道望补充。)