1

与许多语言不同,Swiftswitch必须是详尽无遗的,所以如果我有:

enum Enumeration
{
    case A
    case B
}

那么这段代码是无效的:

switch enumeration
{
case .A:
    break
}

但是,这些是有效的:

switch enumeration
{
case .A:
    break
case .B:
    break
}

switch enumeration
{
case .A:
    break
default:
    break
}

如果我稍后添加case CEnumeration,第一个有效代码现在将产生编译器错误。第二个是有效的,因为它使用default:, 将捕获.C

如果我遵守 semver carthage(或 Swift 包管理器)支持,我必须为此增加主要版本吗?

对此的扩展扩展到 Objective-C(和隐式 C)。由于 Swift 中支持 C 枚举作为 Swift 枚举,因此这也适用于打算在 Swift 中使用的 Objective-C 或 C 框架。我不确定如何解决这个问题,因为这些语言没有这样的限制(如果你的编译器很好,只是一个警告)。

4

1 回答 1

5

答:在 Swift 中向公共枚举添加新案例是一项重大变革。

推理

语义版本控制与某些语言功能无关,它与您的 API 稳定性有关。
语义版本包括主要的 3 个部分(1.0.1):

  • Major - 如果将任何向后不兼容的更改引入公共 API,则必须递增
  • 次要- 如果向公共 API 引入新的、向后兼容的功能,则必须递增
  • 路径- 如果只引入向后兼容的错误修复,则必须递增

例子:

假设您有一个包含此枚举声明的框架:

//Framework
public enum Enumeration {
    case A
    case B
}

这是一个使用该框架的应用程序

//App 
let en = Enumeration.A
switch en {
    case .A: print("A")
    case .B: print("B")
}

添加更改
现在让我们对框架进行一些更改,看看会发生什么。让我们在枚举中添加一个新案例。

//Framework
public enum Enumeration {
    case A
    case B
    case C
}

Enumeration是一个公共 API,它对外界可见。这意味着我们已经改变了我们的 API。它必须是主要或次要更新,补丁是API未更改的时候。

如果您尝试编译和应用程序,它将失败,因为switch在 Swift 中必须是详尽无遗的。 在此处输入图像描述

所以我们做了重大的 API 更改,我们必须增加主要版本。1.0.1 -> 2.0.0

重要的提示!

此问题将在 Swift 3 中处理。
这是 Apple 团队对此问题的回应。

在此处输入图像描述

这将作为弹性模型的一部分进行处理。公共枚举在其模块之外不会完全匹配。

于 2016-02-04T13:02:53.187 回答