iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 0
0
Software Development

30 天學會開發 App系列 第 1

30 天上手 iOS App 開發 DAY 19

  • 分享至 

  • xImage
  •  

今天來聊聊 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 的值是不會變的


系列文
30 天學會開發 App1
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言