无法使用“@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”将具有关联值的枚举案例标记为可能不可用的主要内容,如果未能解决你的问题,请参考以下文章