13

Swift 3/iOS 10 在 , 上添加了一个新的初始化UIImageimageLiteralResourceName

extension UIImage {

    required public convenience init(imageLiteralResourceName name: String)
}

这与 有何不同public init?(named name: String)?Inamed是一个失败的初始化程序,但imageLiteralResourceName会在无效的图像名称上崩溃。imageLiteralResourceName以安全换取业绩吗?你应该什么时候使用imageLiteralResourceNameover named

4

1 回答 1

9

查看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

它所做的只是强制解开init(named:).

似乎它只是以下_ImageLiteralConvertible协议的实现CompilerProtocols.swift

public protocol _ImageLiteralConvertible {
  init(imageLiteralResourceName path: String)
}

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

这可能与#imageLiteral添加到 Xcode 8 的新图像文字功能 ( ) 有关,并且永远不应直接调用。

于 2016-06-14T02:22:04.887 回答