一尘不染

在Swift中必须在类,结构和枚举之间进行选择时,我应该怎么推理?

swift

由于类,结构和枚举都具有构造函数,属性和计算属性,因此在它们之间进行选择时应如何推理?


阅读 216

收藏
2020-07-07

共1个答案

一尘不染

ChristopheD和Jack
Jack的回答很好,但是我觉得他们没有触及枚举,或者错过了它们的重要性。Swift枚举(即将)是代数数据类型的完整实现。传统上,类和结构用于以面向对象的语言对数据进行建模,但是枚举通常仅限于用作将变量的值限制为有限可能性的便捷方法。例如(C
++):

enum MaritalStatus { Unmarried, Married, Divorced, WidowedOrWidowered };
MaritalStatus m = Unmarried;

Swift枚举可以完成上述任务,但可以做更多的事情。当然,《语言指南》中有一个非常不错的条形码建模示例,但是我所知道的最好的示例确实推动了使用代数数据类型进行数据建模的观点是Scott
Wlaschin的演示文稿:http ://www.slideshare.net/ScottWlaschin/ddd -with-
fsharptypesystemlondonndc2013

您可能会从整个演示文稿中受益,但实际上要“理解”要点,就是幻灯片60,其中他展示了如何在典型的业务应用程序中建模“付款方式”。

在演示文稿中的例子是F#中,但F#是不是 那个 遥远的斯威夫特,你可以在它们之间很容易映射。例如,Swift中的付款方式枚举如下所示:

enum PaymentMethod {
    case cash // No extra data needed.
    case cheque(Int) // Cheque #.
    case card(CardType, CardNumber) // 2 pieces of extra data.
}

上面的要点是,每个订单的付款方式只能是以上三种方式之一。编译器将不允许任何其他操作。这是构建整个类层次结构以对这些几乎琐碎的事物进行建模的非常简洁的替代方法。

演示实际上是从那里开始的,最好的部分是Swift可以执行F#在数据建模,使用可选类型等方面几乎可以完成的所有工作。

2020-07-07