[Swift]陣列元素是class和struct時的引用測試
結論寫在最前面:
陣列元素是struct時,複製陣列後修改,以及修改指向陣列元素的變數都不會影響到原來的陣列;元素是class時則會。
詳細的測試用例一圖清楚明瞭。
測試程式碼
class Person : CustomDebugStringConvertible {
var debugDescription: String {
return "debug:\(age)"
}
var age : Int = 0
init(age:Int){
self.age = age
}
}
func forClass() {
var perArr = [Person]()
perArr.append(Person(age:12))
perArr.append(Person(age:13))
perArr.append(Person(age:14))
print("A:perArr = \(perArr)")
//perArr = [debug:12, debug:13, debug:14]
var copyArr = perArr
print("A:copyArr = \(copyArr)")
//A:copyArr = [debug:12, debug:13, debug:14]
//==============[case 1]=======================
//操作:對陣列複製後,修改複製得到的陣列的元素,
copyArr[1].age = 100
print("B:copyArr = \(copyArr)")
//B:copyArr = [debug:12, debug:100, debug:14]
print("B:perArr = \(perArr)")
//B:perArr = [debug:12, debug:100, debug:14]
//結果:原來陣列的元素也會發生改變,兩個輸出結果裡都是'debug:100';所以陣列元素依然是引用
//==============[case 2]=======================
//操作:新建一個元素,把元素新增到陣列後再修改該元素
let testP = Person(age:999)
copyArr.append(testP)
print("C:copyArr = \(copyArr)")
//C:copyArr = [debug:12, debug:100, debug:14, debug:999]
print("A:testP = \(testP)")
//A:testP = 999
testP.age = 888
print("D:copyArr = \(copyArr)")
//D:copyArr = [debug:12, debug:100, debug:14, debug:888]
//結果:陣列的元素也會發生改變,輸出結果裡有'debug:888';所以陣列元素依然是引用
}
struct User : CustomDebugStringConvertible {
var age : Int = 0
var debugDescription: String {
return "debug:\(age)"
}
}
func forStruct() {
var perArr = [User]()
perArr.append(User(age:12))
perArr.append(User(age:13))
perArr.append(User(age:14))
print("A:perArr = \(perArr)")
//perArr = [debug:12, debug:13, debug:14]
var copyArr = perArr
print("A:copyArr = \(copyArr)")
//A:copyArr = [debug:12, debug:13, debug:14]
//==============[case 1]=======================
//操作:對陣列複製後,修改複製得到的陣列的元素,
copyArr[1].age = 100
print("B:copyArr = \(copyArr)")
//B:copyArr = [debug:12, debug:100, debug:14]
print("B:perArr = \(perArr)")
//B:perArr = [debug:12, debug:13, debug:14]
//結果:原來陣列的元素不會發生改變,兩個輸出結果裡都是'debug:100'和‘debug:13’
//==============[case 2]=======================
//操作:新建一個元素,把元素新增到陣列後再修改該元素
var testP = User(age:999)
copyArr.append(testP)
print("C:copyArr = \(copyArr)")
//C:copyArr = [debug:12, debug:100, debug:14, debug:999]
print("A:testP = \(testP)")
//A:testP = 999
testP.age = 888
print("D:copyArr = \(copyArr)")
//D:copyArr = [debug:12, debug:100, debug:14, debug:999]
//結果:陣列的元素不會發生改變,輸出結果裡還是'debug:999';
}
相關文章
- swift中Class和Struct的區別SwiftStruct
- Swift中Class和Struct異同SwiftStruct
- 深入理解Swift中的Class和StructSwiftStruct
- java陣列元素的引用Java陣列
- 何時用 struct?何時用 class?Struct
- swift 陣列Swift陣列
- 陣列--移除陣列中指定的元素,不改變原陣列和改變原陣列陣列
- PHP陣列學習之計算陣列元素總和PHP陣列
- Swift - 陣列、字典、集合Swift陣列
- 陣列元素逆序陣列
- 陣列元素的數量陣列
- C# 中 Struct 和 Class 的區別總結C#Struct
- C++基礎(八)struct和class的區別C++Struct
- typedef and struct inside class definition?StructIDE
- 陣列的主元素查詢陣列
- 陣列元素劃分陣列
- golang 陣列去重 移除陣列指定元素Golang陣列
- C++ class 和 struct 可以相互繼承嗎C++Struct繼承
- js找出陣列中出現最多的元素和次數JS陣列
- 陣列中每個陣列元素出現的次數陣列
- LeetCode 2535[陣列元素和與數字和的絕對差值]LeetCode陣列
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列
- 旋轉陣列中的最小元素陣列
- 透過指標引用陣列指標陣列
- JavaScript陣列元素全排列JavaScript陣列
- JavaScript刪除陣列元素JavaScript陣列
- 找出陣列中元素出現次數超過陣列長度一半的元素陣列
- 陣列filter方法對陣列元素進行過濾陣列Filter
- Javascript - 陣列和陣列的方法JavaScript陣列
- C語言中陣列首地址和陣列第一個元素的地址有什麼區別C語言陣列
- JS能力測評經典題--計算給定陣列 arr 中所有元素的總和JS陣列
- Array · 刪除陣列中指定的元素陣列
- 找到兩個陣列中的公共元素陣列
- java陣列如何遍歷全部的元素Java陣列
- 根據陣列的值刪除元素陣列
- PHP 刪除陣列中元素的方式PHP陣列
- JS能力測評經典題--查詢陣列元素位置JS陣列
- Java 從陣列來看值傳遞和引用傳遞Java陣列