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