Swift 4.2 Setter Getter,通过此函数的所有路径都将自行调用

时间:2018-10-15 21:30:17

标签: swift variables setter getter

在Swift 4.2中,我开始看到很多问题,其中一个我不太确定如何解决,因为我的getter方法应该返回值本身。

我想象发生了什么事,即当调用self.type时,吸气剂将尝试访问该吸气剂

我该如何解决此问题?

这是带有错误的代码的屏幕截图。

enter image description here

预先感谢

这是书面代码

@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;
    }
};

3 个答案:

答案 0 :(得分:11)

您的问题是没有存储的属性type供getter返回。 type是一个计算属性。当您尝试读取其值时,它将调用您定义的getter。该吸气剂称为吸气剂,吸气剂又称为吸气剂,吸气剂称为吸气剂……等等。您具有无限递归。

您最有可能要做的是拥有一个存储的属性,只要设置了该属性,它就具有一些奇特的行为。与其将计算属性与自定义getset一起使用,不如将存储属性与willSetdidSet块一起使用:

@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
}