在swift中定义类型方法有很多种,其中一种就是以,引用和值来区分的。具体定义如下:
●值类型(Value Types):每个实例都保留了一分独有的数据拷贝,一般以结构体 (struct)、枚举(enum) 或者元组(tuple)的形式出现。
●引用类型(Reference Type):每个实例共享同一份数据来源,一般以类(class)的形式出现。
至于如何具体的来区分和理解这两者可以用一个具体的例子来表示。
##### 值类型
以值类型定义一个对象 let a: [String] = ["值类型"1,"值类型2"] (Array为值类型)
如果这时候重新声明一个元素 var b: [String] = a (let 和 var 对值类型和引用类型无影响,这里声明为var是因为接下来会修改b的内容)
此时(不考虑swift做的优化)a与b应该是不同的对象,因为是拷贝,所以a与b内容是相同的,但是内存已经不同因为a与b已经是两个完全不同的对象了(但是此时在代码里测试时发现a与b地址还是一样的,这是因为swift对值类型做过优化,copy之后只要不对b做修改,那么a和b仍为同一个对象,这样做为了减少内存的消耗)。
这时候对b做修改 b.append("值类型3") 此时b得知变为["值类型"1,"值类型2","值类型3"]而a任然是["值类型"1,"值类型2"] a并没有跟着b的值而变化,此时a与b内存地址也不相同。
##### 引用类型
以引用类型定义一个对象 let c: UIView = UIView() (UIView为class引用类型)
将c赋值给d let d: UIView = c (对于引用类型的赋值没有copy的,所以对象c和d为同一个对象,修改c或者d里面的值时,另一个对象里面对应的值也会跟着变化,因为这两个本就是同一个对象)
总结,值类型和引用类型最大的区别就是复制时的变化。值类型是生成一个新的对象,而引用类型使用同一个对象。