Exc_bad_access 在 BOOL Getter 上 swift

Exc_bad_access on BOOL Getter in swift

我想在属性的布尔值从真到假,从假到真时做一些操作。
我为此设置了 getter setter,因此我可以对布尔值 属性 的 setter 执行这些操作。

但总是因 EXC_BAD_ACCESS 代码 = 2 而崩溃,任何人都可以帮助我理解我在这里做错了什么。

var reportActivityStarted:Bool {
        set {
            if self.reportActivityStarted {
                //Operations when boolean is true
            }else{
                //Operations when boolean is false
            }
        }
        get{
            return self.reportActivityStarted
        }
    }  

当我更改它的布尔值时,它在 get{

处崩溃
self.reportActivityStarted = true

如果你想使用getset你可能需要有另一个变量来保存set中的值并在get中请求它。像这样:

var _reportActivityStarted = false 
var reportActivityStarted:Bool {
        set {
             _reportActivityStarted = newValue
            if _reportActivityStarted {
                //Operations when boolean is true
            }else{
                //Operations when boolean is false
            }
        }
    get{
        return _reportActivityStarted
    }
}  

但是根据我在您的代码示例中看到的情况,您根本不需要 setget。您只需要改用 didSet 即可。像这样

var reportActivityStarted:Bool {
            didSet {
            if reportActivityStarted {
                //Operations when boolean is true
            }else{
                //Operations when boolean is false
            }
        }
}

正如 @Unheilig 已经指出的那样,您正在生成一个 无限递归调用 。事实上 reportActivityStarted 的 getter 正在递归调用自身。

如果你想在设置或检索 属性 时 运行 一些逻辑,那么你应该像这样使用 属性 观察者 :

var reportActivityStarted: Bool {
    willSet(newValue) {
        switch reportActivityStarted {
        case true: print("reportActivityStarted is true before assignment") // <- your logic goes here
        case false: print("reportActivityStarted is false before assignment") // <- your logic goes here
        }
    }
}