我有一个自定义的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首先找到它。
答案 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。 从同一个调用另一个初始值设定项(方便或已指定) 课。