似乎我无法使用可用于存储属性的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方法中也不可能 - 但即使我希望将默认值保留在我的属性定义附近。有没有人有想法?
答案 0 :(得分:9)
将默认值设置为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
答案 1 :(得分:3)
可以在init
中初始化计算属性,就像这样。
class TestProperty {
var b = 0
var a: Int {
get {
return b + 1
}
set {
b = newValue - 1
}
}
init(a: Int) {
self.a = a
}
}
但是,可以为存储的属性b
提供默认值,并从a
检索b
。
存在计算属性的原因是您可以根据其他属性计算(或更新)某些内容,并直接通过计算属性使用它。
我想知道您为什么要为计算属性提供默认值。