Swift 4.2 Setter Getter,所有经过这个函数的路径都会调用自己
Swift 4.2 Setter Getter, All paths through this function will call itself
使用 swift 4.2 我开始看到很多问题,其中一个我不太确定如何解决,因为我的 getter 方法应该返回值本身.
我想发生的事情是 getter 在调用 self.type
时会尝试访问 getter
我该如何解决这个问题?
这是错误代码的屏幕截图。
提前致谢
这里是写代码
@objc var type: DecisionType {
set {
if(newValue == DecisionType.DecisionDouble){
//Yes button and NO button should be showing
okButton.isHidden = true;
yesButton.isHidden = false;
noButton.isHidden = false;
}
else {
//Only Ok button should be showing
okButton.isHidden = false;
yesButton.isHidden = true;
noButton.isHidden = true;
}
}
get {
return self.type;
}
};
您的问题是 getter 到 return 没有存储 属性 type
。 type
是计算出来的 属性。当您尝试读取它的值时,它会调用您定义的 getter。 getter 调用 getter,getter 又调用 getter,getter 又调用 getter... 等等。你有无限递归。
最有可能的是,您想要做的是存储一个 属性,只要设置它就会有一些奇特的行为。与其使用带有自定义 get
和 set
的计算 属性,不如使用带有 willSet
或 didSet
块的存储 属性:
@objc var type: DecisionType {
didSet {
let isDecisionDouble = newValue == DecisionType.DecisionDouble
okButton.isHidden = isDecisionDouble;
yesButton.isHidden = !isDecisionDouble;
noButton.isHidden = !isDecisionDouble;
}
}
对于这种情况,更好的方法是有一个额外的 属性,您将在 getter 的 return 值中使用它,并在主 属性 时设置它] 改变。
例如,假设您使用的主要 属性 是 type
然后有一个额外的 属性 _type
请注意它旁边的 下划线 .
那么这里是你将如何设置和检索你的和设置你的主要 属性 type
// This is a an extra property which you will use internally
private var _type: DecisionType?
// Then use it as shown below
var type:DecisionType? {
get {
return _type
}
set {
_type = newValue
}
}
我的问题是我在父协议扩展中有 get/set 而不是实际协议的协议扩展:
protocol MainProtocol: SubProtocol {
var mainVariable: String { get set }
}
protocol SubProtocol {
var subVariable: String { get set }
}
extension MainProtocol {
var mainVariable { get { return self.mainVariable } set { self.mainVariable = newValue } }
//I KEPT MY VARIABLE HERE.
var subVariable { get { return self.subVariable } set { self.subVariable = newValue } }
}
extension SubProtocol {
//THIS IS WHERE THE VARIABLE SHOULD HAVE BEEN
}
使用 swift 4.2 我开始看到很多问题,其中一个我不太确定如何解决,因为我的 getter 方法应该返回值本身.
我想发生的事情是 getter 在调用 self.type
时会尝试访问 getter我该如何解决这个问题?
这是错误代码的屏幕截图。
提前致谢
这里是写代码
@objc var type: DecisionType {
set {
if(newValue == DecisionType.DecisionDouble){
//Yes button and NO button should be showing
okButton.isHidden = true;
yesButton.isHidden = false;
noButton.isHidden = false;
}
else {
//Only Ok button should be showing
okButton.isHidden = false;
yesButton.isHidden = true;
noButton.isHidden = true;
}
}
get {
return self.type;
}
};
您的问题是 getter 到 return 没有存储 属性 type
。 type
是计算出来的 属性。当您尝试读取它的值时,它会调用您定义的 getter。 getter 调用 getter,getter 又调用 getter,getter 又调用 getter... 等等。你有无限递归。
最有可能的是,您想要做的是存储一个 属性,只要设置它就会有一些奇特的行为。与其使用带有自定义 get
和 set
的计算 属性,不如使用带有 willSet
或 didSet
块的存储 属性:
@objc var type: DecisionType {
didSet {
let isDecisionDouble = newValue == DecisionType.DecisionDouble
okButton.isHidden = isDecisionDouble;
yesButton.isHidden = !isDecisionDouble;
noButton.isHidden = !isDecisionDouble;
}
}
对于这种情况,更好的方法是有一个额外的 属性,您将在 getter 的 return 值中使用它,并在主 属性 时设置它] 改变。
例如,假设您使用的主要 属性 是 type
然后有一个额外的 属性 _type
请注意它旁边的 下划线 .
那么这里是你将如何设置和检索你的和设置你的主要 属性 type
// This is a an extra property which you will use internally
private var _type: DecisionType?
// Then use it as shown below
var type:DecisionType? {
get {
return _type
}
set {
_type = newValue
}
}
我的问题是我在父协议扩展中有 get/set 而不是实际协议的协议扩展:
protocol MainProtocol: SubProtocol {
var mainVariable: String { get set }
}
protocol SubProtocol {
var subVariable: String { get set }
}
extension MainProtocol {
var mainVariable { get { return self.mainVariable } set { self.mainVariable = newValue } }
//I KEPT MY VARIABLE HERE.
var subVariable { get { return self.subVariable } set { self.subVariable = newValue } }
}
extension SubProtocol {
//THIS IS WHERE THE VARIABLE SHOULD HAVE BEEN
}