与许多语言不同,Swift语言switch必须详尽无遗,所以如果我有:
enum Enumeration
{
case A
case B
}
Run Code Online (Sandbox Code Playgroud)
然后此代码无效:
switch enumeration
{
case .A:
break
}
Run Code Online (Sandbox Code Playgroud)
但是,这些是有效的:
switch enumeration
{
case .A:
break
case .B:
break
}
switch enumeration
{
case .A:
break
default:
break
}
Run Code Online (Sandbox Code Playgroud)
如果稍后添加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):
假设您有一个包含以下枚举声明的框架:
//Framework
public enum Enumeration {
case A
case B
}
Run Code Online (Sandbox Code Playgroud)
这是使用该框架的应用
//App
let en = Enumeration.A
switch en {
case .A: print("A")
case .B: print("B")
}
Run Code Online (Sandbox Code Playgroud)
现在添加更改,让我们对框架进行一些更改,然后看看是否已发生。让我们为枚举添加一个新的案例。
//Framework
public enum Enumeration {
case A
case B
case C
}
Run Code Online (Sandbox Code Playgroud)
该Enumeration是一个公共的API,这是对外界可见。这意味着我们已经更改了API。它必须是主要更新或次要更新,补丁是在不更改API的情况下进行的。
如果您尝试编译和应用,它将失败,因为switch在Swift中必须详尽无遗。
因此,我们对API进行了重大更改,并且必须增加主要版本。1.0.1-> 2.0.0
此问题将在Swift 3中处理。
这是Apple团队对此问题的回应。
这将作为弹性模型的一部分进行处理。公共枚举将无法在其模块之外进行完全匹配。
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |