枚举关联值的情况不能用 "@available" 标记为潜在不可用。

11

我在以下代码中使用 Xcode 13 时遇到了错误消息。

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

枚举案例(enum cases)带有关联值(associated values)时,无法使用 '@available' 标记为“可能不可用”。

有人知道我为什么会收到这个错误消息,以及如何解决它吗?在 Xcode 12 中它还好好的。

5个回答

12

请参考 Swift 编译团队在此处提供的解释和解决方案。

这是有意为之的。对于可能不可用的含有有效负载的枚举情况,ABI(应用二进制接口)未定义。过去这种情况能够工作是因为您的应用程序恰好没有要求有效负载的(可能不可用的)类型元数据而已。请将 Foo 标记为最少可用情况或增加部署目标版本。 https://github.com/apple/swift/pull/36327

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


7
现在它被标记为已解决,但在 Xcode 13.0 (13A233) 中我仍然遇到了这个问题。 - EvGeniy Ilyin

6
我在使用“SwiftMessages”来显示弹出消息时遇到了相同的信息。我只是将“pod 'SwiftMessages'”替换为“pod 'SwiftMessages', '~> 5.0'”。

3

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

下面是摘录:

编译器曾错误地接受@available注释,用在带有较新关联值的枚举类型case上,而这些较新的关联值是超过部署目标范围的。(80238318)

例如:

@available(macOS 12, *)
public struct Crayon {}

public enum Pen {
  case pencil

  @available(macOS 12, *)
  case crayon(Crayon)
}

尽管这在某些情况下可行,但Swift运行时通常需要进行必要的动态布局,否则可能导致运行时崩溃。现在编译器拒绝在枚举案例中使用比部署目标更新的可用性。
因此,尽管以前可以这样做,但现在无法实现,因为编译器无法执行所需的检查。
您可以将整个枚举标记为"@available"。但是,没有完整上下文的情况下,很难找到解决方案。

2

只需更新您的Pods。我认为您正在使用一些已经过时的Pods,适用于Xcode 13。例如,名为SwiftMessages的Pod就有这种问题。在进行pod update之后,我解决了这个问题。 希望能够帮到您。


1
目��你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0

我通过注释掉语法@available(iOS 13.0, *)来解决了错误Enum cases with associated values cannot be marked potentially unavailable with '@available'

错误是Swift Compiler Error,在NowPlayingInfoProperty.swift文件中有两个错误代码。

原始代码如下:

@available(iOS 13.0, *)
case serviceIdentifier(String?)
...

修改代码如下:

//@available(iOS 13.0, *)
case serviceIdentifier(String?)
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接