【问题标题】:Swift: Default Initializer for Computed PropertySwift:计算属性的默认初始化器
【发布时间】:2014-10-15 01:06:32
【问题描述】:

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

@IBDesignable public class MyRoundedCornersView: UIView {

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

}

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

@IBDesignable public class MyRoundedCornersView: UIView {

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

}

我得到了不太有用的'(() -> () -> $T1) -> $T2' is not identical to 'Double' 错误。我查找了here 以了解如何执行此操作,但似乎 Apple 不支持计算属性的默认值。至少我什么都找不到。

那么我如何才能确保我的属性有默认值? This thread 表示在 init 方法中也不可能——但即使我想在我的属性定义附近保留默认值。有人有想法吗?

【问题讨论】:

    标签: ios swift properties initialization


    【解决方案1】:

    将默认值设置为 computed property 是没有意义的,因为它没有正确的值:

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

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

    class Layer { // <- The type of layer
        var cornerRadius: CGFloat = 8.0
        // ...
    }
    

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

    var cornerRadius:CGFloat = 8.0
    {
        didSet
        {
            self.layer.cornerRadius = self.cornerRadius
        }
    }
    

    编辑:这并不能保证 layer.cornerRadius == self.cornerRadius,尤其是直接设置 layer.cornerRadius 时

    【讨论】:

    • 我不确定我是否正确理解了第一个解决方案,但在 Layer 类中设置该值似乎不是正确的解决方案。它应该在我的子类中修复。第二种方法实际上是我想用计算属性替换的第一种方法,以确保始终给出 self.cornerRadiuslayer.cornerRadius 之间的相等性。
    • 是的,这就是我的编辑内容。一个解决方案可能是将此默认值传递给层 init : init() { super.init(cornerRadius:8.0) }
    【解决方案2】:

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

    class TestProperty {
        var b = 0
        var a: Int {
            get {
                return b + 1
            }
            set {
                b = newValue - 1
            }
        }
    
        init(a: Int) {
            self.a = a
        }
    }
    

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

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

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

    【讨论】:

    • 感谢您提供此解决方案!现在就可以了。但正如您所看到的,我有一个用例,我想为计算属性设置默认值,以确保此 UIView 子类的使用默认为圆角视图。所以我问自己的问题与你在这里问我的完全相反:为什么不应该计算属性也有默认值?特别是在子类中,您从不直接为您在计算中引用的存储属性设置默认值。
    • @Dschee,那么您应该将self.layer.cornerRadius 设置为您想要提供的默认值,而不是计算属性cornerRadius。因为计算属性不打算做这样的事情,尽管它可以这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多