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

Tra*_*lly 13 variables getter setter swift

使用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;
    }
};
Run Code Online (Sandbox Code Playgroud)

Ale*_*ica 16

您的问题是typegetter 没有存储的属性可以返回.type是计算属性.当您尝试读取其值时,它会调用您定义的getter.这个getter调用getter,getter又调用getter来调用getter ......依此类推.你有无限的递归.

最有可能的是,你打算做的是拥有一个存储的属性,只要它的集合有一些奇特的行为.而不是使用带有自定义的计算属性,getset使用带有willSetdidSet块的存储属性:

@objc var type: DecisionType {
    didSet {
        let isDecisionDouble = newValue == DecisionType.DecisionDouble

        okButton.isHidden = isDecisionDouble;
        yesButton.isHidden = !isDecisionDouble;
        noButton.isHidden = !isDecisionDouble;
    }
}
Run Code Online (Sandbox Code Playgroud)


Mus*_*les 9

对于这种情况,如果有一个额外的属性,您将使用它作为 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
}
}

Run Code Online (Sandbox Code Playgroud)