添加 Swift enum case 是否需要主要的 semver 版本更新?

Does adding a Swift enum case require a major semver version update?

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

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 C 添加到 Enumeration,第一个有效代码现在将产生编译器错误。第二个是有效的,因为它使用 default:,它将捕获 .C.

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

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

答案: 向 Swift 中的 public 枚举添加新案例是重大更改。

推理

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

  • Major - 如果对public API
  • Minor - 如果新的 向后兼容 功能引入,则必须递增publicAPI
  • 路径 - 如果仅引入向后兼容的错误修复,则必须递增

示例:

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

//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是publicAPI,对外可见。这意味着我们已经改变了我们的 API。必须是 Major 或 Minor update,patch 是 API 不变的时候。

如果你尝试编译和应用,它会失败,因为switch必须在Swift中穷举。

所以我们做出了突破性的 API 改变,我们必须增加主要版本。 1.0.1 -> 2.0.0

重要提示!

此问题将在 Swift 3.
中处理 这是苹果团队对这个问题的回应。

This will be handled as part of the resilience model. Public enums will not be exhaustively matchable outside their module.