值类型和引⽤类型
Value Type : 传递和赋值时将进⾏复制
- struct, enum, Int/Float/Double/Bool,String, Array, Set, Dictionary
Reference Type: 只会使⽤引⽤对象的⼀个 "指向"。
- class
Value Type Pros:
- 值类型的⼀个特点是在传递和赋值时进⾏复制,每次复制肯定会产⽣额外开销, Swift 中这个消耗被控制在了最⼩范围内,在没有必要复制的时候,值类型的复制都是不会发⽣的。也就是说,简单的赋值,参数的传递等等普通操作,虽然我们可能⽤不同的名字来回设置和传递值类型,但是在内存上它们都是同⼀块内容。
var a = [1,2,3]
var b = a
let c = b
值类型被复制的时机是值类型的内容发⽣改变时, 值类型在复制时,会将存储在其中的值类型⼀并进⾏复制
最⼤的考虑是为了线程安全
Assumption: "⼀旦赋值就不太会变化" 这种使⽤情景在 Cocoa 框架中是占有绝⼤多数的,这有效减少了内存的allocation and memory deallocation
Trade-off/ Best practice:
- 按照具体的数据规模和操作特点来决定到时是使⽤值类型的容器还是引⽤类型的容器
- 在需要处理⼤量数据, 频繁操作 (增减) 其中元素时,选择 NSMutableArray NSMutableDictionary 传reference,
- 在容器内条⽬⼩, 容器本⾝数⽬多的情况,应该使⽤ Swift 语⾔内建的 Array 和 Dictionary 。
Func's Inout: actually pass value***
- when enter into func, pass a current copy in, pass value
- when exit func, pass local copy to input
- within func, parameters is "var"
// example
// passing value
// within the func, left and right is var
func swap<T>(_ left: inout T, _ right: inout T) {
(left, right) = (right, left)
}
var hehe = 1
var haha = 2
swap(&hehe, &haha)
// passing value
// within the func, inputValue is let
func passValue(_ inputValue: Int) { }