自定义UIView子类,在使用实例变量时需要实现init(编码器:)

时间:2017-11-24 19:09:43

标签: ios swift uikit

我已经阅读了几篇关于为什么在尝试创建自己的构造函数时需要实现UIView的构造函数init(coder :)的帖子(这是因为UIView继承自NSCoding协议并且使用自定义构造函数它不会更长的时间继承父构造函数。

我的问题是为什么这个类不需要实现init(编码器:)

import UIKit

class CardView: UIView {

    @IBInspectable var cornerRadius : CGFloat = 3.0

    // layoutSubviews is called when view is created
    override func layoutSubviews() {
        layer.cornerRadius = cornerRadius

        layer.masksToBounds = true // Set the false to see shadows. TODO: Figure out how to clip subviews and allow a shadow

        layer.shadowOffset = CGSize(width: 0, height: 3)
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowRadius = 9.0
        layer.shadowOpacity = 0.12
    }

}

这个班的时候:

import UIKit

class ColorView: UIView {

    var color : UIColor

    override func layoutSubviews() {
        //layer.backgroundColor = self.color.cgColor
    }

}

我正在寻找技术原因,当CardView类没有时,ColorView类现在需要一个构造函数。

2 个答案:

答案 0 :(得分:2)

这是因为ColorView没有为color提供任何初始值设定项或默认值。如果将var定义更改为例如var color = UIColor.black初始化程序要求消失。

答案 1 :(得分:2)

对于Swift中的类的初始化,您必须确保在初始化时,您已经为所有存储的属性赋予了默认值,或者您已将它们声明为可选。

通过声明为可选方式,它在初始化时的默认值为零。

所以在CardView中只有一个存储的属性" cornerRadius"并且您已经给出了默认值3.0。所以不需要init(编码器:)。

在ColorView类中,只有一个商店属性" color",既没有为它赋值,也没有将它声明为可选。 所以init(编码器:)是必需的。