【问题标题】:How to create custom init with frame for UIView [duplicate]如何为 UIView 创建带有框架的自定义初始化 [重复]
【发布时间】:2015-02-02 17:34:53
【问题描述】:

下面的代码出现Property self.color not initialized as super.init call 错误。请问如何正确覆盖 init(frame:) 函数?我想将 color 与 init 调用一起传递。

class CircleView: UIView {

    // properties
    let color: UIColor

    init(frame: CGRect, color: UIColor) {
        self.color = color
        super.init(frame: frame)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func drawRect(rect: CGRect) {
        ...
    }
}

【问题讨论】:

  • 查看stackoverflow.com/questions/24021093/… 另外,可能需要尝试使用 var 而不是 let。也可以设置颜色的默认值。
  • let color: UIColor 更改为 var color: UIColor!
  • 这两个技巧都有效。我正在服用@bbarnhart。谢谢你。很高兴接受作为答案..
  • 我相信init(frame:) 方法很好。错误应该在init(coder:) 方法中。在这里,您在初始化 color 属性之前调用 super.init

标签: ios swift initialization


【解决方案1】:

请注意,任何声明为“let”的属性都必须在所有可能的初始化过程中进行初始化。当调用反序列化 init 时,您没有这样做。这就是它无法编译的原因。

既然你明白了原因,让我们去寻找解决方案吧。你可以让你的常量成为一个可选变量,所以它不需要被初始化,这应该可以解决问题但又增加了一个问题:现在它是可变的。

如果您仍想保留一个 let(并且您可能想要,否则您已经定义了一个 var),您需要解码来自第二个 init 接收的编码器的内容。在这样做的同时,您还必须覆盖序列化过程并写入颜色值,以便您的 uiview 可以正确序列化。

如果您根本不关心序列化,第一个选项可以解决您的问题。如果您关心您的代码发生了什么,我建议您了解 Swift 中的序列化 API 并实现正确的 init(decoder) 和编码器方法。

【讨论】:

  • 好点。来自“The Swift Programming Language”:“您可以在初始化期间的任何时候修改常量属性的值,只要它在初始化完成时设置为确定的值。”
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多