[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 陣列Swift陣列
- swift中Class和Struct的區別SwiftStruct
- Swift中Class和Struct異同SwiftStruct
- java陣列元素的引用Java陣列
- 深入理解Swift中的Class和StructSwiftStruct
- 窺探Swift之別具一格的Struct和ClassSwiftStruct
- 何時用 struct?何時用 class?Struct
- Swift語言中class、struct、enum的聯絡與區別SwiftStruct
- 陣列排序的測試陣列排序
- swift 陣列Swift陣列
- Swift,陣列Swift陣列
- 陣列--移除陣列中指定的元素,不改變原陣列和改變原陣列陣列
- C++中 struct 和 class 的區別C++Struct
- C++中struct 和 class的區別C++Struct
- PHP陣列學習之計算陣列元素總和PHP陣列
- Struct與Class辨析Struct
- lua陣列操作效能測試陣列
- 一個測試陣列用法的例子陣列
- 陣列元素逆序陣列
- 陣列元素的數量陣列
- Swift - 陣列、字典、集合Swift陣列
- Swift-陣列(Arrays)Swift陣列
- C# 中 Struct 和 Class 的區別總結C#Struct
- C++基礎(八)struct和class的區別C++Struct
- Swift中實現Array陣列和NSArray陣列的相互轉換與遍歷Swift陣列
- OC 和 Swift 中是如何用列舉的?Swift
- 陣列元素劃分陣列
- 陣列的主元素查詢陣列
- 找出陣列中元素的位置陣列
- golang 陣列去重 移除陣列指定元素Golang陣列
- C++ class 和 struct 可以相互繼承嗎C++Struct繼承
- 陣列中每個陣列元素出現的次數陣列
- js建立和訪問陣列元素程式碼JS陣列
- js找出陣列中出現最多的元素和次數JS陣列
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列
- 陣列的操作處理與陣列元素的氣泡排序 (轉)陣列排序
- 旋轉陣列中的最小元素陣列
- JavaScript陣列元素全排列JavaScript陣列