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