无法在 UIView 中设置 @IBInspectable 计算属性

And*_*rej 2 uiview swift ibinspectable

我正在尝试向IBInspectableUIView添加颜色,以便我可以在故事板中设置它,然后在代码中使用它。在这篇关于 UITextField 的帖子中,我已经看到我可以利用扩展和添加计算属性,但我不能让它为 UIView 工作。

身份检查员 在此处输入图片说明

我遇到了崩溃:无法在(UIView)上设置(additionalColor1)用户定义的检查属性:[setValue:forUndefinedKey:]:此类不符合键 additionalColor1 的键值编码。

知道是什么导致了崩溃以及如何修复它?

这是我的代码:

extension UIView {
    @IBInspectable var additionalColor1: UIColor? {
        return self.additionalColor1
    }
}
Run Code Online (Sandbox Code Playgroud)

作为参考,我粘贴了可用于为 UITextField 设置占位符颜色的代码(与上面的 url 相同)。这工作正常:

extension UITextField {
    @IBInspectable var placeHolderColor: UIColor? {
        get {
            return self.placeHolderColor
        }
        set {
            self.attributedPlaceholder = NSAttributedString(string: self.placeholder != nil ? self.placeholder! : "", attributes:[NSForegroundColorAttributeName: newValue!])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mis*_*cha 5

如您的问题标题所述

Swift 扩展只能为类型添加计算属性,但不能添加存储属性

(有关更多详细信息,请参阅The Swift Programming Language 中扩展章节。)

您发布的示例实际上是有缺陷的——即使此时它在 Stackoverflow 上有 50 个赞成票。如果您从属性的 getter 返回属性本身的值,则您正在创建一个循环。

@IBInspectable var additionalColor1: UIColor? {
    return self.additionalColor1
}
Run Code Online (Sandbox Code Playgroud)

如果您有 aview并且您尝试访问view.additionalColor1代码中的任何位置,您的属性的 getter 将被调用,它返回self.additionalColor1——或者换句话说:它再次返回属性的值——猜猜怎么做?通过调用属性的吸气剂!(等等...)

您提到的帖子中的示例仅“有效”,因为显然从未调用过吸气剂。它只是设置placeHolderColor改变另一个存储属性的计算属性,即文本字段的attributedPlaceholder.

因此,虽然您可以通过扩展向现有类添加计算属性,但您永远不能将其视为存储在某处的具体值。计算属性只能用于以某种方式转换您分配给它的值并将结果存储现有存储属性中。