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
?
答案 0 :(得分:7)
看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:)
的结果。
它似乎只是CompilerProtocols.swift
中_ImageLiteralConvertible
协议的实现:
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
)有关,不应该直接调用。