Array是个结构体,就是值类型,值类型传递传递的是值,修改传递过去的值不会改变原来的值
当Array传递的时候里面的元素是如何传递的呢?
当元素为值类型时是值传递
当元素为引用类型时是引用传递
let age = 10
let arr = [age]
var testArr = arr
print("age=\(age);arr[0]=\(arr[0]);testArr[0]=\(testArr[0])")
testArr[0] = 20
print("age=\(age);arr[0]=\(arr[0]);testArr[0]=\(testArr[0])")
输出:
age=10;arr[0]=10;testArr[0]=10
age=10;arr[0]=10;testArr[0]=20
- 当改变引用类型的元素时,两个数组内此元素都会改变
let person1 = Person.init();
person1.name = "张三"
person1.age = 10
let person2 = Person.init();
person2.name = "李四"
person2.age = 20
let arr = [person1,person2]
var testArr = arr;
print("arr[0]地址=\(arr[0]);testArr[0]地址=\(testArr[0])")
print("arr->person1年龄\(arr[0].age!),testArr->person1年龄\(testArr[0].age!)")
print(arr)
person1.name = "修改了"
testArr[0].age = 100
print("arr->person1姓名\(arr[0].name!),testArr->person1姓名\(testAr
[0].name!)")
print("arr->person1年龄\(arr[0].age!),testArr->person1年龄\(testArr[0].age!)")
输出:
arr[0]地址=<Aiscreen.Person: 0x6000032e8cc0>;testArr[0]地址=<Aiscreen.Person: 0x6000032e8cc0>
arr->person1年龄10,testArr->person1年龄10
[<Aiscreen.Person: 0x6000032e8cc0>, <Aiscreen.Person: 0x6000032e88a0>]
arr->person1姓名修改了,testArr->person1姓名修改了
arr->person1年龄100,testArr->person1年龄100
- 当改变数组时数组会改变地址(元素地址不变,两个数组指向同一个地址,元素地址改变,两个数组指向不同地址)
- 同一个内容,同一个地址。
- 改变了内容,新的地址。
testArr.remove(at: 0)
print("arr[0]地址=\(arr[0]);testArr[0]地址=\(testArr[0])")
输出:
arr[0]地址=<Aiscreen.Person: 0x6000032e8cc0>;testArr[0]地址=<Aiscreen.Person: 0x6000032e88a0>