NS_CLOSED_ENUM实际上是不可编辑的吗?

时间:2019-05-23 15:41:37

标签: swift swift5 nsenumerator

According the Apple docs,为Swift 5添加的新NS_CLOSED_ENUM宏不可更改。这怎么可能?我不能只是清理构建,添加值并重新编译我的应用?

  

重要

     

一旦枚举被标记为已关闭,则是添加新值的二进制和源不兼容更改。如果您怀疑枚举在将来会获得私有或其他公共案例,请改用NS_ENUM宏。

我能够在我们的应用程序中添加一个新值,并且可以很好地进行编译(在更新开关盒之后)。

2 个答案:

答案 0 :(得分:2)

使用NS_CLOSED_ENUM时,您向API的使用者承诺,枚举将永远不会改变,无论是现在还是将来。

当然,没有什么可以阻止您进行更改,但是,如果您这样做了,您现在就兑现了承诺。如您所说,在更新开关盒后,它可以很好地编译

如果您声明它是一个封闭的枚举,则表示所有开发人员都不必担心它会更改。这在Swift 5中很有用,它在@unknown default语句中添加了switch构造来处理未封闭的枚举。

请参见this post for more information

答案 1 :(得分:0)

当然不是不可编辑的。但这意味着如果你编辑它,任何使用它的代码都需要更新才能编译。这样,它就像函数签名一样“可编辑”。

因此,如果您要向其他开发人员发布库,则应仔细考虑是要在次要更新(不需要任何代码迁移才能采用)中还是仅在主要更新中添加新值(这可能需要代码迁移)。

但是如果您在一个代码库中使用枚举,请务必使用 NS_CLOSED_ENUM!它使消费代码更清晰(您的开关中没有“默认”案例,这些案例仅存在于记录“未知案例”并显示错误)并且编译器将确保您在添加新的枚举案例时更新代码库中的每个开关(而不是,充其量是一个您可能会错过的警告)。