【问题标题】:Uses of available in Swift在 Swift 中使用 available
【发布时间】:2019-08-03 06:00:00
【问题描述】:

我已经阅读了 MVVM 的 Ray Wenderlich 教程,并且在视图中它具有

@available(*, unavailable)
public required init?(coder: NSCoder) {
    fatalError("init?(coder:) is not supported")
}

我了解提供所需的 init,但我无法理解为什么会有 @available(*,available)。

* 表示所有平台上的可用性 - 我们肯定已经拥有了吗?然后我们不是将它标记为对所有平台都不可用 - 在这种情况下,fatalError 不会永远不会被执行吗?

我看过 Swift 指南 https://docs.swift.org/swift-book/ReferenceManual/Attributes.html 仍然不明白

【问题讨论】:

  • 表示该方法在所有版本中都不可用。也就是说,你不能调用它。我觉得这里的属性使用有点过分了。

标签: swift


【解决方案1】:

从您提供的链接中,

unavailable 参数表示声明在指定平台上不可用。指定 Swift 版本可用性时不能使用此参数。

所以本质上你是说这个初始化器在所有平台上都不可用,这是有道理的,因为这个初始化器没有实现。

通过添加这个属性,你可以让 Swift 在你尝试使用初始化器时发出错误,从而防止人们意外调用它:

【讨论】:

    【解决方案2】:

    有时在不实际删除的情况下使一段代码不可用是很方便的。我想到了两个用例:

    • 子类使超类的方法不可用。
    • 我们需要保留在源代码中以继续支持旧代码的遗留代码 版本或文档。

    在这种情况下,我们可以使用 Swift 的可用声明属性来告诉编译器使用标记的对象或函数的代码不应该编译。

    例如,如果您必须将NSObject 子类化为具有需要在初始化时传递的存储常量的东西,并且不想让消费者调用init,因为这样做没有意义为常量设置一个默认值,你可以让init对其消费者不可用:

    class Dummy: NSObject {
    
      let foo: String
    
      init(foo: String) {
        self.foo = foo
      }
    
      @available(*, unavailable)
      override init() {
        fatalError()
      }
    }
    

    注意

    不幸的是,从 2.2 开始,这种可用性声明不会转换为 Objective-C 属性,因此 Objective-C 使用者仍会看到方法和类是可用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-31
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多