UIImage(命名:)和UIImage(imageLiteralResourceName :)有什么区别?

JAL*_*JAL 7 uiimage ios swift swift3 ios10

Swift 3/iOS 10添加了一个新的初始化程序UIImage,imageLiteralResourceName:

extension UIImage {

    required public convenience init(imageLiteralResourceName name: String)
}
Run Code Online (Sandbox Code Playgroud)

这有public init?(named name: String)什么不同?我named是一个可用的初始化程序,但imageLiteralResourceName会在无效的图像名称上崩溃.是否imageLiteralResourceName交易安全性能?你何时应该imageLiteralResourceName结束named

JAL*_*JAL 7

看看UIKit的开源实现,似乎没有区别:

extension UIImage : _ImageLiteralConvertible {
  private convenience init!(failableImageLiteral name: String) {
    self.init(named: name)
  }

  public required convenience init(imageLiteralResourceName name: String) {
    self.init(failableImageLiteral: name)
  }
}

public typealias _ImageLiteralType = UIImage
Run Code Online (Sandbox Code Playgroud)

所有这一切都是强制解开结果init(named:).

看起来它只是在以下方面_ImageLiteralConvertible找到的协议的实现CompilerProtocols.swift:

public protocol _ImageLiteralConvertible {
  init(imageLiteralResourceName path: String)
}
Run Code Online (Sandbox Code Playgroud)

AppKit也有类似的实现:

extension NSImage : _ImageLiteralConvertible {
  private convenience init!(failableImageLiteral name: String) {
    self.init(named: name)
  }

  public required convenience init(imageLiteralResourceName name: String) {
    self.init(failableImageLiteral: name)
  }
}

public typealias _ImageLiteralType = NSImage
Run Code Online (Sandbox Code Playgroud)

这可能与添加到Xcode 8的新图像文字功能有关.