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版本。(有哪位知道望补充。)

本文探讨了Swift中setter方法的实现方式,指出直接在setter中访问成员变量会导致运行时错误。通过引入中间变量的方法,解决了这一问题,并详细解释了如何在Swift中正确地实现setter方法。
1720

被折叠的 条评论
为什么被折叠?



