在Swift 4.2中,我开始看到很多问题,其中一个我不太确定如何解决,因为我的getter方法应该返回值本身。
我想象发生了什么事,即当调用self.type时,吸气剂将尝试访问该吸气剂
我该如何解决此问题?
这是带有错误的代码的屏幕截图。
预先感谢
这是书面代码
@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;
}
};
答案 0 :(得分:11)
您的问题是没有存储的属性type
供getter返回。 type
是一个计算属性。当您尝试读取其值时,它将调用您定义的getter。该吸气剂称为吸气剂,吸气剂又称为吸气剂,吸气剂称为吸气剂……等等。您具有无限递归。
您最有可能要做的是拥有一个存储的属性,只要设置了该属性,它就具有一些奇特的行为。与其将计算属性与自定义get
和set
一起使用,不如将存储属性与willSet
或didSet
块一起使用:
@objc var type: DecisionType {
didSet {
let isDecisionDouble = newValue == DecisionType.DecisionDouble
okButton.isHidden = isDecisionDouble;
yesButton.isHidden = !isDecisionDouble;
noButton.isHidden = !isDecisionDouble;
}
}
答案 1 :(得分:0)
对于这种情况,一种更好的方法是拥有一个额外的属性,该属性将在getter的返回值中使用,并在您的主要属性更改时进行设置。
例如,假设您使用的主要属性是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
}
}
答案 2 :(得分:0)
我的问题是我在父协议扩展中获得/设置,而不是实际协议的协议扩展:
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
}