与许多语言不同,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 Package Manager)支持,我是否必须为此增加主版本?
对此的扩展适用于Objective-C(并隐含C)。由于Swift像Swift枚举一样支持C枚举,因此这也适用于打算在Swift中使用的Objective-C或C框架。我不确定如何解决这个问题,因为这些语言没有这种限制(如果您的编译器很好,则只是警告)。
答:在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团队对此问题的回应。
这将作为弹性模型的一部分进行处理。公共枚举将无法在其模块之外进行完全匹配。