添加Swift枚举案例是否需要更新主要的semver版本?

时间:2015-12-11 20:38:49

标签: swift semantic-versioning

与许多语言不同,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

如果我遵守carthage(或Swift Package Manager)支持的semver,我是否必须为此增加主要版本?

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

1 个答案:

答案 0 :(得分:4)

答案:在Swift中向公共枚举添加新案例正在打破变革。

推理

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

  • 专业 - 如果向公共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中详尽无遗。 enter image description here

所以我们已经改变了API,我们必须增加主要版本。 1.0.1 - > 2.0.0

重要提示!

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

enter image description here

  

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