返回

Swift 5 中 Switch 语句和枚举冻结

IOS

如今,Swift 5 已问世,相信很多开发者已经升级了自己的 Xcode 工程,以便在最新的 Swift 版本中进行开发。通常情况下,升级 Swift 5 会非常顺利,不会遇到什么大问题。不过,在使用 switch 语句枚举未知值时,可能会遇到很多警告。

到底是什么问题呢?现在让我们通过一小段代码来展示,该代码用于为不同大小的类适配布局。它枚举出了 UIUserInterfaceSizeClass 的所有可能值,然后根据不同的值返回不同的布局。

func layoutForSizeClass(_ sizeClass: UIUserInterfaceSizeClass) -> UIView {
    switch sizeClass {
    case .compact:
        return CompactLayout()
    case .regular:
        return RegularLayout()
    }
}

这段代码在 Swift 5 中会产生以下警告:

“枚举值 ‘.unspecified’ 没有在 switch 语句中处理。添加一个默认分支或处理该值。”

要解决这个警告,有两种方法。

  1. 添加一个默认分支。

switch 语句的末尾添加一个 default 分支,并返回一个默认布局。这将确保在枚举了所有可能的值之后,switch 语句不会遗漏任何值。

func layoutForSizeClass(_ sizeClass: UIUserInterfaceSizeClass) -> UIView {
    switch sizeClass {
    case .compact:
        return CompactLayout()
    case .regular:
        return RegularLayout()
    default:
        return DefaultLayout()
    }
}
  1. 使用 @unknown 标记枚举。

Swift 5 中的新特性之一是 @unknown 关键字。它可以用来标记枚举,以指示编译器在编译时不知道枚举的所有可能值。这样,编译器就不会发出警告。

@unknown
enum UIUserInterfaceSizeClass {
    case compact
    case regular
}

func layoutForSizeClass(_ sizeClass: UIUserInterfaceSizeClass) -> UIView {
    switch sizeClass {
    case .compact:
        return CompactLayout()
    case .regular:
        return RegularLayout()
    }
}

值得注意的是,@unknown 关键字只是一种临时解决方案。在将来,你应该始终知道枚举的所有可能值,并相应地处理它们。

建议

在开发过程中,尽量避免使用枚举冻结。如果必须使用枚举冻结,请确保你了解它的含义和影响。在可能的情况下,请使用 @unknown 关键字来标记枚举。

枚举冻结是一个相对新的特性,它可能会在未来的 Swift 版本中发生变化。因此,请务必关注 Apple 的文档,以了解有关枚举冻结的最新信息。