根据 Apple 文档,为 Swift 5 添加的新NS_CLOSED_ENUM
宏是不可更改的。这怎么可能?我不能只清理构建、添加值并重新编译我的应用程序吗?
重要的
一旦枚举被标记为已关闭,添加新值就是二进制和源不兼容的更改。如果您对将来获得私有或额外公共案例的枚举有任何疑问,请改用 NS_ENUM 宏。
我能够为我们的应用程序添加一个新值并编译得很好(在更新开关案例之后)。
根据 Apple 文档,为 Swift 5 添加的新NS_CLOSED_ENUM
宏是不可更改的。这怎么可能?我不能只清理构建、添加值并重新编译我的应用程序吗?
重要的
一旦枚举被标记为已关闭,添加新值就是二进制和源不兼容的更改。如果您对将来获得私有或额外公共案例的枚举有任何疑问,请改用 NS_ENUM 宏。
我能够为我们的应用程序添加一个新值并编译得很好(在更新开关案例之后)。
当您使用 时NS_CLOSED_ENUM
,您向 API 的使用者承诺,无论现在还是将来,枚举都不会改变。
当然,没有什么能阻止你做出改变,但如果你这样做了,你现在就违背了这个承诺。正如你所说,它在更新 switch case 后编译得很好。
如果你声明它是一个封闭的枚举,你就是在告诉所有开发人员他们永远不必担心它会发生变化。这在 Swift 5 中很有用,它@unknown default
在语句中添加了一个构造switch
来处理未封闭的枚举。
有关更多信息,请参阅此帖子。
当然,它不是不可编辑的。但这意味着如果您确实对其进行了编辑,则任何使用它的代码都需要在编译之前进行更新。这样,它就像函数签名一样“可编辑”。
因此,如果您要向其他开发人员发布一个库,您应该仔细考虑是要在次要更新中添加新值(不需要任何代码迁移即可采用)还是只在主要更新中添加新值(可能需要代码迁移)。
但是,如果您在一个代码库中使用枚举,请务必使用 NS_CLOSED_ENUM!它使消费代码更清洁(在您的开关中没有“默认”情况,仅用于记录“未知情况”并显示错误)并且编译器将确保您在添加新的枚举情况时更新代码库中的每个开关(而不是,充其量是您可能会错过的警告)。