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

问题描述 投票:6回答:1

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

ios swift uiimage swift3 ios10
1个回答
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:)的结果。

它似乎只是在_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)有关,不应该直接调用。

© www.soinside.com 2019 - 2024. All rights reserved.