iOS自定义init问题,如何设置默认的init方法?

时间:2019-09-11 13:28:11

标签: ios swift init

我有一个自定义的UILabel类。

class CustomLabel: UILabel{


    init(_ title: String = "Star"){
        super.init(frame: CGRect.zero)
        text = title
    }

    override init(frame: CGRect) {
        fatalError("Not Implemented")
    }


    required init?(coder aDecoder: NSCoder) {
        fatalError("Not Implemented")
    }


}

我可以这样打

let head = CustomLabel("Front")

我不能这样打

let lhs = CustomLabel()

Xcode报告:未实现,程序在此处停止。

override init(frame: CGRect) {
     fatalError("Not Implemented")
}

显然let lhs = CustomLabel()调用方法override init(frame: CGRect) {

如何将init(_ title: String = "Star"){设置为默认值?

即。让Xcode首先找到它。

1 个答案:

答案 0 :(得分:3)

删除您实现的另一个init并根据需要设置

class CustomLabel: UILabel {

    required init(_ title: String = "Star"){
        super.init(frame: CGRect.zero)
        text = title
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

let label1 = CustomLabel()
print(label1)

这有效并使用了预期的初始化

编辑:

巴斯蒂安(Bastian)在回答中提供了有用的链接,但此后将其删除。

链接:Adding Swift Convenience Initializers

链接中有用的代码段(以防链接中断):

  

指定的还是方便的?

     

首先回顾一下两种类型的初始化程序:

     

指定的初始化器是类的主要初始化器。它   必须先完全初始化其类引入的所有属性   调用超类初始化程序。一堂课可以有多个   指定的初始化程序。

     

便捷初始化程序是辅助初始化程序,必须调用   指定的同一类的初始值设定项。当您需要时很有用   提供默认值或其他自定义设置。上课不   需要方便的初始化程序。

     

三个规则

     

很明显,您需要记住指定的和指定的三个规则。   类类型的便捷初始化器:

     
      
  • 指定的初始化程序必须从   直接超类。
  •   
  • 便捷初始化程序必须调用另一个   来自同一类的初始值设定项。
  •   
  • 便利初始化器必须   最终调用指定的初始化程序。
  •   
     

这对我们意味着什么?   简单来说,不要从便利初始化程序中调用super。   从同一个调用另一个初始值设定项(方便或已指定)   课。