文章内容来源于《Functional Programing in Swift》,详情请看原著
The Value of Immutability
swift 对于控制值改变有一些机制。在这章我们将解释这些机制工作的不同,区分值类型,引用类型,同时说为什么限制使用可变状态是一个好idea。
Variables and References
在swift中,有两种方法来初始化一个变量,通过使用 var 或者let
var x:Int = 1 let y:Int = 2
var :变量 (mutable) let: 常量(immutable variables)
Value Types vs. Reference Types
我们都知道结构体是值类型,而类是引用类型,这一行为上的细微区别就造就了架构上的不一样
值类型的实例,不管是在赋值或是作为函数参数的时候,都是被复制的。Int,String,Array,Dictionary,tuple,emum ,struct都是值类型
引用类型的实例(主要是类,Any changes to this reference will also mutate the original object or instance. )可以有多个所有者。将一个引用赋值给一个新的变量或者传递给一个函数的时候, 他们都指向同一个实例。这是你熟悉的对象行为。
说白了,值类型就是完全拷贝,引用仅仅是传递了一个指针。
值类型能够使你构建非常清晰,简单,更容易测试的典型架构。
值类型与外部状态通常没有依赖或者只有很少的依赖,所以当你思考它们的时候,你只需要考虑很少的一部分。
值类型是内在可组合的和可重用的,因为它们是可交换的。
最后,一个值类型层允许你从应用程序稳定的业务逻辑中独立出活跃的行为元素。代码越稳定,你的系统会变得越容易测试和修改。
Structs and Classes: Mutable or Not?
对于struct来说,如果申明为let,那么他的值是不可改变的。例如
let immutablePoint = PointStruct(x:0, y: 0)
immutablePoint = PointStruct(x:1, y: 1) // 这个是产生err的
immutablePoint.x = 3 // 这也是不允许的
但如果你声明为var的话,immutablePoint.x = 3 ; 这完全是允许的
如果PointStruct的x,和y申明为let,name
immutablePoint.x = 3 // Rejected
但是,你可以将其赋值给新的结构体实体
immutablePoint = PointStruct(x:1, y: 1) //这是允许的