【问题标题】:What is the difference between UIImage(named:) and UIImage(imageLiteralResourceName:)?UIImage(named:) 和 UIImage(imageLiteralResourceName:) 有什么区别?
【发布时间】:2016-10-14 14:08:08
【问题描述】:

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

extension UIImage {

    required public convenience init(imageLiteralResourceName name: String)
}

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

【问题讨论】:

  • this subject上的苹果文档似乎不完整
  • 我还没有下载 Xcode 8,但我猜imageLiteralResourceName 只是新图像文字的语法糖(你永远不会显式调用它)。
  • @Fonix 看起来没什么区别,见UIKit.swift
  • @MartinR 在开源版本的 Swift 中找到了实现,看起来没有区别。如果是为了新的图像文字,苹果为什么不保密呢?
  • 所有XxxLiteralConvertible 协议和对应的init(xxxLiteral ...) 方法都是公开的,但我从未看到明确使用它们的理由。

标签: ios swift uiimage swift3 ios10


【解决方案1】:

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) 有关,并且永远不应直接调用。

【讨论】:

  • 参考 1(开源 UIKit 存储库)链接已过期。他们撤销了源代码,还是移动了它?我在 stdlib 中找到了this,但这不是完整的实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多