Swift 官博文章翻译 - 值类型与引用类型

原文链接:Value and Reference Types

译者:Mudox

Swift 的所有类型都归于两大类:

本文我们将探讨下他们各自的优点,以及如何在他们之间做选择。

可变性在安全性上扮演的角色

每次我们选择使用值类型而非引用类型时一个最主要的原因就是能够让代码更加清晰明了,这样我们就更容易掌控代码。如果您得到总是一份独一无二的数据拷贝,您就能确信在您的代码的其他地方不会私下改动您当前的数据。这在多线程环境中是非常有用的,因为线程经常可能在您不经意间改变了您的数据,而这种错误一旦产生又非常难排查。

由于两种类型之间的差异主要发生在修改数据时,因此当您的实例不可修改时,两者表现就完全一样了。

您可能在想某些情况下让类类型不可修改也是很有必要的呀。这样我们既能使用 Cocoa 的 NSObject 对象,又能享受到值语义的好处。今天,通过只定义只读的存储属性,以及避免暴露那些会更改状态的 API 接口,您也能用 Swift 创建出不可修改的类来。事实上,很多常用的 Cocoa 类,比如 NSURL,都被设计为不可修改的类。但是 Swift 并没有像对结构体,枚举那样,在语言层面上提供确保类不变性的机制(比如施加在子类上面)。

如何选择?

那么当您要构建一个新的类型时,您如果决定使用那种类型的语义呢?当您要使用 Cocoa 时,许多 API 都要用到 NSObject 的子类,因此您必须使用类类型。对于其他的情况,这里有一些指导建议:

使用值类型的情况:

使用引用类型的情况:

在 Swift 中,数组 Array,字典 Dictionary,字符串 String 都是值类型。他们用起来就像 C 语言中简单的 int 值一样,就像每个实例都是一份独一无二的拷贝。您无需刻意去拷贝他们以防止数据被其他代码暗地里修改掉。更重要的是,在多线程之间您可以安全的传递这些值类型而无需同步措施。基于安全第一的原则,Swift 提供的这种模型能帮助您写出更加可预测的代码。