【问题标题】:Does adding a Swift enum case require a major semver version update?添加 Swift 枚举案例是否需要主要的 semver 版本更新?
【发布时间】:2016-03-17 21:01:20
【问题描述】:

与许多语言不同,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)。由于 Swift 中支持 C 枚举作为 Swift 枚举,因此这也适用于打算在 Swift 中使用的 Objective-C 或 C 框架。我不确定如何解决这个问题,因为这些语言没有这样的限制(如果你的编译器很好,只是一个警告)。

【问题讨论】:

  • (我相信答案是“是”,但需要确认)
  • 你不需要 default 因为 Swift 的类型推断。由于 Swift 可以推断出您的枚举类型,因此它知道您的枚举有两种情况,并且您的 Switch 确实是详尽无遗的。

标签: swift semantic-versioning


【解决方案1】:

答案:在 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 中必须是详尽无遗的。

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

重要提示! ??

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

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

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 2018-11-03
    • 2020-08-11
    • 2019-04-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2013-10-14
    • 2021-07-07
    相关资源
    最近更新 更多