今天來聊聊 Class 與 Struct 的差異
在開始之前我們必須先理解 “傳址” 與 “傳值” 的差異,也就是 Reference Type 與 Value Type 的差異
Call by Reference
不會另外建創造一個物件,它會把指向位置的指標傳入,簡單來說就是拿到同一個物件
Call by Value
會建立一個新的獨立的物件,來儲存你傳入的參數,簡單來說就是複製一份但是不是同一個物件
Class
class Cat{
var name:String
init(_ name:String) {
self.name = name
}
}
這邊宣告一個看記憶體指標的函示
func printAddress(_ str:UnsafeMutablePointer<String>){
print(str)
}
var myCat = Cat("Coco")
print(myCat.name) // Coco
printAddress(&myCat.name) //0x0000604000054680
var tempCat = myCat
myCat.name = "Dabe"
printAddress(&tempCat.name) //0x0000604000054680
print(myCat.name) // Dabe
可以看到 myCat 跟 tempCat 指向同一個記憶體位址當今天改動 tempCat 的值 myCat 的值也會跟者改變
struct Dog {
var name:String
init(_ name:String) {
self.name = name
}
}
var myDog = Dog("Lucky")
printAddress(&myDog.name) //0x00000001165eaed0
print(myDog.name) //Lucky
var tempDog = myDog
tempDog.name = "Nancy"
printAddress(&tempDog.name) //0x00000001165eaee8
print(myDog.name) //Lucky
這時候 myDog 跟 tempDog 指向不同一個記憶體位址當今天改動 tempDog 的值 myDog 的值是不會變的