Swift值类型和引用类型
值类型
在Swift中,所有基本类型:整型(Int),浮点型(float),布尔类型(Boolean),字符串类型(String),数组类型(Array),字典(Dictionary),元组(Tuple)都是值类型,它们底层都是以结构体(Struct)的形式实现的,所有结构体(struct)也是值类型,枚举(Enum)也是值类型。
创建的任何结构和枚举实例以及它们作为属性的任何值类型在代码中传递时总是被复制,它会创建一个全新的副本,改变副本的值不影响原始数据的值。例如:
struct card
{
var value1: Int
var value2: Int
init(value1: Int, value2: Int){
self.value1 = value1
self.value2 = value2
}
}
var A = card(value1: 10, value2: 10)
var B = A
B.value2 = 20
print(A.value1,A.value2)
print(B.value1,B.value2)
输出结果:
10 10
10 20
B复制了A,在改变B的value2之后,并不会影响A的value2。因为是值拷贝。相当于如下图:
引用类型
Swift中,类(Class)属于引用类型。与值类型不同,引用类型在分配给变量或者常量,或者传递给函数时,其不会复制。而是对相同现有实例的引用。相当于只是创建一个共享的实例分身,两者公用一套数据。修改一处,另一处也会更改。
比如:
class cards
{
var value1: Int
var value2: Int
init(value1: Int, value2: Int){
self.value1 = value1
self.value2 = value2
}
}
var C = cards(value1: 10, value2: 10)
var D = C
D.value2 = 20
print(C.value1,C.value2)
print(D.value1,D.value2)
显示结果为:
10 20
10 20
D复制C,但因为是引用类型,改变了D的value2的值,C的value2的值也会改变。
好比如下图中: