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

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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。

以上是关于无法使用“@available”将具有关联值的枚举案例标记为可能不可用的主要内容,如果未能解决你的问题,请参考以下文章

具有默认枚举值的枚举类方法失败

使用 Graphene 返回具有字符串值的枚举列表

Grails NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

text 具有字符串值的枚举

从字符串转换为具有大量值的 Java 枚举 [重复]

枚举类型在typescript中给出双数组