Swift:计算属性的默认初始化程序

Jee*_*hut 5 initialization properties ios swift

我似乎无法使用可用于存储属性的Default Initializers方法为计算属性提供默认值.这是一个用例,我需要这个:

@IBDesignable public class MyRoundedCornersView: UIView {

    @IBInspectable var cornerRadius: CGFloat {
        get {
            return self.layer.cornerRadius
        }
        set {
            self.layer.cornerRadius = newValue
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我想给cornerRadius一个默认值.但以下不起作用(刚添加= 8.0):

@IBDesignable public class MyRoundedCornersView: UIView {

    @IBInspectable var cornerRadius: CGFloat = 8.0 {
        get {
            return self.layer.cornerRadius
        }
        set {
            self.layer.cornerRadius = newValue
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我得到了不那么有用的'(() -> () -> $T1) -> $T2' is not identical to 'Double'错误.我在这里查找了如何做到这一点,但似乎Apple不支持计算属性的默认值.至少我找不到任何东西.

那么我怎样才能确保我的属性有默认值?这个线程说在init方法中也不可能 - 但即使我想在我的属性定义附近保留默认值.有没有人有想法?

Axe*_*min 9

将默认值设置为计算属性没有意义,因为它没有正确的值:

[...]计算属性,实际上不存储值.相反,它们提供了一个getter和一个可选的setter来间接检索和设置其他属性和值.

也许你想在图层类型中设置默认值,例如:

class Layer { // <- The type of layer
    var cornerRadius: CGFloat = 8.0
    // ...
}
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是使用这样的存储属性:

var cornerRadius:CGFloat = 8.0
{
    didSet
    {
        self.layer.cornerRadius = self.cornerRadius
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这不保证layer.cornerRadius == self.cornerRadius,特别是如果直接设置了layer.cornerRadius


Win*_*r C 4

可以像这样初始化计算属性init

class TestProperty {
    var b = 0
    var a: Int {
        get {
            return b + 1
        }
        set {
            b = newValue - 1
        }
    }

    init(a: Int) {
        self.a = a
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我们可以只为存储的属性提供一个默认值b,然后a从中检索b

计算属性存在的原因是您可以根据其他属性计算(或更新)某些内容,并通过计算属性直接使用它。

我想知道为什么你想为计算属性提供默认值。