iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
1
Software Development

挑戰 30天內送審一支APP 系列 第 3

兩種不同的宣告 : class 與 struct (D day + 2)

在swift中有兩個很相似的宣告方式,分別是” struct” 和 “class”。
struct 是 call by value ( value type) , class 是 call by reference (reference type) 。
下面透過程式來解釋其中的不同

首先,先建立一個名為 Svalue的 struct且內有一個值為0的變數 x,另外宣告兩個變數 f1, f2。
將x得值分別assign給f1,f2後再將一個常數30分配給f2

struct Svalue {
    var x:Int = 0
}
var f1 = Svalue()
var f2 = f1
f2.x = 30
print("The value of x in f1 is \(f1.x)")
print("The value of x in f2 is \(f2.x)")

結果可以知道f1和f2分別為不同的想個記憶體區塊,所以值會不相同)

https://ithelp.ithome.com.tw/upload/images/20171222/20107698yBOQdLA3zS.png

同樣的也建立一個名為Cvalue的class並含有一個值為0的變數y,
宣告兩個變數 f3, f4。
將y得值分別assign給f3,f4後再將一個常數50分配給f4

class Cvalue {
    var y:Int = 0
}
var f3 = Cvalue()
var f4 = f3
f4.y = 50
print(“The value of y in f1 is \(f3.y)")
print("The value of y in f1 is \(f4.y)")

結果可以得知,因為f3,f4 指向同樣的記憶體位置,因此最後將50 assign給f4時,f3同樣也會是50

另外print出 class與 struct的生成資料也是有不同
Struct:

struct boy{
    var name = "Jason"
    var age = 18
}
let cuteBoy = boy()
print(cuteBoy)

可以直接列印出生成資料

Class

class girl {
    var name = "kate"
    var age = 17
}
let cuteGirl = girl()
print(cuteGirl)
print(cuteGirl.name,cuteGirl.age)

不能直接列印出生成資料,而要取得函數內的屬性才可以列印


上一篇
UIViewController Lifecycle (D day + 1)
下一篇
如何印出記憶體位址 (D day + 3)
系列文
挑戰 30天內送審一支APP 30

1 則留言

0
吳晉榮
iT邦新手 5 級 ‧ 2017-12-27 10:11:22

HI~看起來class跟struct相似處很多,但swift中還是會分別使用class跟struct。
請問兩者的使用時機是什麼呢?

我要留言

立即登入留言