与许多语言不同,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框架。我不确定如何解决这个问题,因为这些语言没有这样的限制(只是警告,如果你的编译器很好)。
答案 0 :(得分:4)
答案:在Swift中向公共枚举添加新案例正在打破变革。
语义版本控制与某些语言功能无关,它与您的API稳定性有关 语义版本由主要3部分(1.0.1)组成:
假设您有一个包含此枚举声明的框架:
//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团队对此问题的回应。
这将作为弹性模型的一部分进行处理。公共枚举不会在其模块之外进行详尽的匹配。