Swift 在便利初始化中解包可选初始化
Swift unwrap optional init inside convenience init
是否可以在 convenience init 中以某种方式解包可选的 init?
convenience init(...) {
self.init?(...) ?? self.init()
}
实际上,我正在尝试为 UIColor
:
做一些方便的初始化
extension UIColor {
convenience init(for item: ItemType) {
self.init(named: item.rawValue) ?? self.init() // something like this
//self.init(named: item.rawValue)! // works
}
}
你不能有这样的解包,因为禁止将不可失败的初始化程序委托给可失败的初始化程序。这是 following language reference principle:
的结果
In either case, if you delegate to another initializer that causes initialization to fail, the entire initialization process fails immediately, and no further initialization code is executed.
初始化器在说话方式上受到严格限制。但是工厂方法不是!这编译(和工作):
extension UIColor {
static func create(for item: ItemType) -> UIColor {
UIColor(named: item.rawValue) ?? UIColor()
}
}
是否可以在 convenience init 中以某种方式解包可选的 init?
convenience init(...) {
self.init?(...) ?? self.init()
}
实际上,我正在尝试为 UIColor
:
extension UIColor {
convenience init(for item: ItemType) {
self.init(named: item.rawValue) ?? self.init() // something like this
//self.init(named: item.rawValue)! // works
}
}
你不能有这样的解包,因为禁止将不可失败的初始化程序委托给可失败的初始化程序。这是 following language reference principle:
的结果In either case, if you delegate to another initializer that causes initialization to fail, the entire initialization process fails immediately, and no further initialization code is executed.
初始化器在说话方式上受到严格限制。但是工厂方法不是!这编译(和工作):
extension UIColor {
static func create(for item: ItemType) -> UIColor {
UIColor(named: item.rawValue) ?? UIColor()
}
}