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()
    }
}