既然类、 struct 和枚举都有构造函数、属性和计算(computed)属性,我在 Select 它们时应该如何推理?

推荐答案

ChristopheD和Jack Wu的答案很好,但我觉得他们没有触及枚举,或者忽略了它们的重要性.Swift枚举是(意味着)代数数据类型的完整实现.在面向对象的语言中,类和 struct 传统上用于为数据建模,但枚举通常仅限于作为一种方便的方式,将变量的值限制在有限的可能性范围内.例如(C++):

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

Swift Enum可以做到以上几点,但可以做得更多.当然,《语言指南》有一个非常好的barcode modelling example个,但我所知道的用代数数据类型建模数据的最好例子是Scott Wlaschin的演示:http://www.slideshare.net/ScottWlaschin/ddd-with-fsharptypesystemlondonndc2013

你可能会从整个演示中受益,但要真正"理解"这一点,你需要看到的是幻灯片60,其中他展示了如何在典型的业务线应用程序中模拟"支付方法".

演示中的例子都是F#的,但F#离Swift不远,你可以很容易地在它们之间绘制 map .例如,Swift中的付款方式枚举如下所示:

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

上述要点是,每个订单的付款方式只能是上述三种方式中的一种.编译器将不允许任何其他操作.这是一个非常简洁的替代方案,可以用来构建整个类层次 struct 来对这些几乎微不足道的事情进行建模.

演示真正从这里开始,最好的部分是Swift 可以在数据建模、使用可选类型等方面做F#能做的几乎所有事情.

Swift相关问答推荐

操作员如何点逻辑非(.!)在Swift工作?

什么是Swift Concurrency中任务组的正常退出

如何取消正在视图修改器中运行的任务

如何返回JSON数据?

在Swift中,是否只有iOS版本超过15才能导入Swift包?

如果通过计时器循环运行,则检索CPU利用率百分比的SWIFT脚本运行良好.似乎在没有计时器的情况下停留在初始百分比上

在数组中查找最大y值的x值

为什么我不能在这个 Swift 间接枚举中返回 self ?

当变量首次用于其自己的初始化时,如何清除变量...在初始化之前使用错误?

从 actor 的 init 方法调用方法

Swift 包管理器 Package.resolved 文件末尾的版本是什么意思?

MacOS KIND 是如何实现的

在 SwiftUI 中的 ForEach 中使用 id 时如何为数组设置动画索引

将 struct 作为泛型类型传递并访问该泛型类型属性

如何确定扩展中的具体类型?

带有屏幕参数的 NSWindow 初始化程序在初始化时导致致命错误

如何根据 SwiftUI 中的字体大小定义按钮的大小?

Swift 读写图片占用大量内存

快速的 AES 加密

UILabel 文本不换行