Swift 3 / iOS 10在UIImage
上添加了一个新的初始化程序,imageLiteralResourceName
:
extension UIImage {
required public convenience init(imageLiteralResourceName name: String)
}
这与public init?(named name: String)
有什么不同?我named
是一个可用的初始化程序,而imageLiteralResourceName
将崩溃无效的图像名称。 imageLiteralResourceName
是否为性能进行贸易安全?什么时候应该使用imageLiteralResourceName
而不是named
?
看看open-source implementation of 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
这可能与添加到Xcode 8的新图像文字功能(#imageLiteral
)有关,不应该直接调用。