Setter 用于 Swift 中的 Bool
Setter for Bool in Swift
我正在使用自定义 getter,就像这样
var currentShowLiked: Bool {
get {
return [some condition met] ? true : false
}
set {
self.currentShowLiked = newValue
}
}
而且效果很好。但是,我希望能够将 true
或 false
值设置回我的变量,但是 Swift 迫使我实施 setter,这不会产生任何警告,但在运行时,如果我要更改我的变量的值,应用程序会崩溃,没有明显的原因或指向 setter 行 EXC_BAD_ACCESS (code=2...)
的理智解释和控制台中的消息 warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.
我为什么要这样做?
您不能在其 setter 中设置值,因为您正在创建一个调用自身的递归方法,因为:
self.currentShowLiked = newValue
将调用您定义的 set 方法,该方法将继续进行。如果您要覆盖 setter 和 getter,您可能想要一些私有的后备存储 属性。
此外,您还定义了一个基于某些条件的 getter,因此无论如何您都没有使用您在此 属性 上设置的值。我觉得你不需要这套
您上面的代码会崩溃,因为它会导致无限循环 - 您的 setter for currentShowLiked 将 currentShowLiked 设置为新值,然后再次调用 setter,依此类推。
您不必实施 setter,但您不使用 get - 语法如下:
var currentShowLiked: Bool {
return [some condition met]
}
您处于递归上下文中。
您不能在 currentShowLiked 属性 正文中使用 currentShowLiked,如下所示:
// Recursive, Infinite loop
self.currentShowLiked = newValue
解决这个问题:
private var _currentShowLiked : Bool
var currentShowLiked: Bool {
get {
return [ some condition met on _currentShowLiked ] ? true : false
}
set {
self._currentShowLiked = newValue
}
}
这里的错误是误会造成的
当你声明一个
var a:Type
在对象内部分配一个成员值a,并自动创建访问器和修改器以允许您读取和写入该变量。
但是,当您声明
var a:Type { get { ... } set { ... } }
未分配任何成员值 - 您已指出当对象的用户访问(读取)或更改(写入)该值时,您的代码将执行所有必要的操作来响应它。如果您最终希望存储值,则需要将其存储为实际值(需要不同的名称)。
由于你是在对象的内部调用对象的修改器,你已经设置了一个无限循环,这导致你的程序因堆栈溢出而崩溃(所有的函数调用内存都是用来存放函数反复调用自己的记录。
定义自定义 getter 和/或 setter 操作的 Swift 属性 是 计算的 属性 实际上并不存储值。自定义setter可用于修改其他属性的内部状态。
另请参阅:“Swift 编程语言”第 180 页
我正在使用自定义 getter,就像这样
var currentShowLiked: Bool {
get {
return [some condition met] ? true : false
}
set {
self.currentShowLiked = newValue
}
}
而且效果很好。但是,我希望能够将 true
或 false
值设置回我的变量,但是 Swift 迫使我实施 setter,这不会产生任何警告,但在运行时,如果我要更改我的变量的值,应用程序会崩溃,没有明显的原因或指向 setter 行 EXC_BAD_ACCESS (code=2...)
的理智解释和控制台中的消息 warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.
我为什么要这样做?
您不能在其 setter 中设置值,因为您正在创建一个调用自身的递归方法,因为:
self.currentShowLiked = newValue
将调用您定义的 set 方法,该方法将继续进行。如果您要覆盖 setter 和 getter,您可能想要一些私有的后备存储 属性。
此外,您还定义了一个基于某些条件的 getter,因此无论如何您都没有使用您在此 属性 上设置的值。我觉得你不需要这套
您上面的代码会崩溃,因为它会导致无限循环 - 您的 setter for currentShowLiked 将 currentShowLiked 设置为新值,然后再次调用 setter,依此类推。
您不必实施 setter,但您不使用 get - 语法如下:
var currentShowLiked: Bool {
return [some condition met]
}
您处于递归上下文中。
您不能在 currentShowLiked 属性 正文中使用 currentShowLiked,如下所示:
// Recursive, Infinite loop
self.currentShowLiked = newValue
解决这个问题:
private var _currentShowLiked : Bool
var currentShowLiked: Bool {
get {
return [ some condition met on _currentShowLiked ] ? true : false
}
set {
self._currentShowLiked = newValue
}
}
这里的错误是误会造成的
当你声明一个
var a:Type
在对象内部分配一个成员值a,并自动创建访问器和修改器以允许您读取和写入该变量。
但是,当您声明
var a:Type { get { ... } set { ... } }
未分配任何成员值 - 您已指出当对象的用户访问(读取)或更改(写入)该值时,您的代码将执行所有必要的操作来响应它。如果您最终希望存储值,则需要将其存储为实际值(需要不同的名称)。
由于你是在对象的内部调用对象的修改器,你已经设置了一个无限循环,这导致你的程序因堆栈溢出而崩溃(所有的函数调用内存都是用来存放函数反复调用自己的记录。
定义自定义 getter 和/或 setter 操作的 Swift 属性 是 计算的 属性 实际上并不存储值。自定义setter可用于修改其他属性的内部状态。
另请参阅:“Swift 编程语言”第 180 页