【问题标题】:Enum cases with associated values cannot be marked potentially unavailable with '@available'无法使用“@available”将具有关联值的枚举案例标记为可能不可用
【发布时间】:2021-10-15 14:46:21
【问题描述】:

我在以下代码中收到带有 Xcode 13 的错误消息

@available(iOS 13.0, *)
    case windowScene(_: UIWindowScene, windowLevel: UIWindow.Level)

不能用“@available”将具有关联值的枚举案例标记为可能不可用

有谁知道我为什么会收到此错误以及纠正它的解决方案是什么?它在 Xcode 12 中运行良好。

【问题讨论】:

    标签: swift xcode xcode13


    【解决方案1】:

    有关 Swift 编译器团队的解释和解决方法,请参阅 this Swift bug

    这是故意的。具有潜在不可用有效负载的枚举案例的 ABI 没有明确定义。这在过去起作用是巧合,您的应用程序不需要(可能不可用的)有效负载类型元数据。请增加您的部署目标或将 Foo 本身标记为最不可用的情况。 https://github.com/apple/swift/pull/36327

    因此您要么需要将整个枚举标记为@available(iOS 13.0, *),要么需要将部署目标增加到iOS 13.0

    【讨论】:

    • 现在它被标记为已解决,但在 Xcode 13.0 (13A233) 中我仍然拥有它
    【解决方案2】:

    Xcode 13 Beta 3 的发行说明中列出了导致这种情况发生的编译器错误。

    这是一段摘录:

    编译器用于错误地接受枚举上的@available 注解 具有比部署更新的关联值的案例 目标。 (80238318)

    例如:

    @available(macOS 12, *)
    public struct Crayon {}
    
    public enum Pen {
      case pencil
    
      @available(macOS 12, *)
      case crayon(Crayon)
    }
    

    虽然这在某些情况下有效,但 Swift 没有办法 运行时执行通常所需的必要动态布局,因此 这可能会导致运行时崩溃。编译器现在拒绝这样的 可用性比枚举案例上的部署目标更新。


    因此,虽然您以前可以这样做,但现在不能这样做,因为编译器无法执行所需的检查。

    您可以将整个枚举标记为@available。但是,在不了解完整背景的情况下可能很难找到解决方案。

    【讨论】:

      【解决方案3】:

      当我使用 pod 'SwiftMessages' 显示弹出消息时,我收到了相同的消息。

      我刚刚将 pod 'SwiftMessages' 替换为 pod 'SwiftMessages', '~> 5.0'。

      【讨论】:

        【解决方案4】:

        只需更新您的 pod。我认为您正在使用一些对于 Xcode 13 已过时的 pod。例如,一个名为 SwiftMessages 的 pod 就有这种问题。之后,豆荚更新,这个问题为我解决了。 希望对你有帮助。

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 2021-02-24
        • 2022-10-17
        • 2022-12-08
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        相关资源
        最近更新 更多