【问题标题】:Swift unwrap optional init inside convenience initSwift 在便利初始化中解开可选初始化
【发布时间】:2022-01-03 13:11:13
【问题描述】:

是否可以在便利初始化中以某种方式解开可选初始化?

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

【问题讨论】:

  • 对于 UIColor,self.init() 是什么意思?
  • @matt 初始化默认颜色。它可以不同,比如 self.init(white: 1, alpha: 1)

标签: swift optional init


【解决方案1】:

初始化器在说话方式上受到高度限制。但工厂方法不是!这编译(和工作):

extension UIColor {
    static func create(for item: ItemType) -> UIColor {
        UIColor(named: item.rawValue) ?? UIColor()
    }
}

【讨论】:

    【解决方案2】:

    你不能进行这样的解包,因为禁止将不可失败的初始化程序委托给可失败的初始化程序。这是following language reference principle的结果:

    在任何一种情况下,如果你委托给另一个导致初始化失败的初始化器,整个初始化过程会立即失败,并且不会执行进一步的初始化代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多