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
如果你想使用get
,set
你可能需要有另一个变量来保存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
}
}
但是根据我在您的代码示例中看到的情况,您根本不需要 set
和 get
。您只需要改用 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
}
}
}
我想在属性的布尔值从真到假,从假到真时做一些操作。
我为此设置了 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
如果你想使用get
,set
你可能需要有另一个变量来保存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
}
}
但是根据我在您的代码示例中看到的情况,您根本不需要 set
和 get
。您只需要改用 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
}
}
}