2014-12-04 53 views
0

我得到Property self.color not initialized as super.init call错误,下面的代码。我该如何正确覆盖init(frame :)函数?我想通过color以及init调用。如何使用UIView框架创建自定义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) { 
     ... 
    } 
} 
+0

退房http://stackoverflow.com/questions/24021093/error-in-swift-class-property-not-initialized-at-super-init-call 此外,可能需要尝试var而不是let。也可以设置颜色的默认值。 – shim 2014-12-04 18:09:36

+1

将'let color:UIColor'更改为'var color:UIColor!' – bbarnhart 2014-12-04 18:12:11

+0

这两个提示都可以使用。我正在服用@bbarnhart。谢谢。很高兴接受为答案.. – 2014-12-04 18:14:18

回答

2

请注意,声明为“let”的任何属性必须在所有可能的inits期间初始化。当反序列化init被调用时,你并没有这样做。这就是为什么它不编译。

现在你明白了原因,让我们来寻找解决方案。你可以让你的常量成为一个可选变量,所以它不需要被初始化,这应该解决问题,但增加了另一个问题:现在它是可变的。如果你仍想保留一个let(你可能想要,否则你已经定义了一个var),你需要解码第二个init接收到的编码器中的内容。在这样做的同时,您还必须重写序列化过程并写入颜色值,以便您的uiview可以正确序列化。

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

+0

好点。从“Swift编程语言”中:“只要在初始化完成的时间内将其设置为一个确定的值,您就可以在初始化过程中的任何时候修改一个常量属性的值。” – 2014-12-04 18:33:46

相关问题