先上代碼
struct Person: CustomStringConvertible {
var name: String
var age: Int
var description: String {
"Struct name:\(name), age:\(age)"
}
}
var structArrayDict: [String: [Person]] = [:]
var structArray: [Person] = []
structArray.append(Person(name: "Peter", age: 15))
structArrayDict["Person"] = structArray
// 字典中的數(shù)組添加一個(gè)元素
structArrayDict["Person"]?.append(Person(name: "Jerry", age: 5))
//等同于
var personStructArray = structArrayDict["Person"]
personStructArray?.append(Person(name: "Jerry", age: 5))
structArrayDict["Person"] = personStructArray
print(structArrayDict)
輸出 ["Person": [Struct name:Peter, age:15, Struct name:Jerry, age:5]]
在OC中 數(shù)組與字典等容器是引用類型旅敷,而在Swift中容器是值類型生棍。
所以var personStructArray = structArrayDict["Person"]
這樣的代碼其實(shí)是Copy了一個(gè)全新數(shù)組與字典中的數(shù)組只是元素相同。
再來探討Struct 與 Class的值類型與引用類型區(qū)別
//等同于
var personStructArray = structArrayDict["Person"]
personStructArray?.append(Person(name: "Jerry", age: 5))
structArrayDict["Person"] = personStructArray
var peter = personStructArray?[0]
peter?.age = 16
輸出 ["Person": [Struct name:Peter, age:15, Struct name:Jerry, age:5]]
因?yàn)镻eter是Struct是一個(gè)值類型扫皱,無法通用引用修改足绅,var Peter 是復(fù)制的一份全新的Person結(jié)構(gòu)體捷绑。
class Student: CustomStringConvertible {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
var description: String {
"Class name:\(name), age:\(age)"
}
}
var classArrayDict: [String: [Student]] = [:]
var classArray: [Student] = []
classArray.append(Student(name: "Herry", age: 12))
classArrayDict["Student"] = classArray
var studentClassArray = classArrayDict["Student"]
studentClassArray?.append(Student(name: "Jimmy", age: 18))
classArrayDict["Student"] = studentClassArray
var herry = studentClassArray?[0]
herry?.age = 13
print(classArrayDict)
輸出 ["Student": [Class name:Herry, age:13, Class name:Jimmy, age:18]]
這里var herry 是class對(duì)象引用類型,所以herry變量與數(shù)組中的index為0的對(duì)象指向同一個(gè)位置的內(nèi)存數(shù)據(jù)氢妈。