在Swift裡的型別不同
Struct 是 Value Type
, Class 是 Reference Type
記憶體分配不同
struct 在記憶體中被分配在stack
區塊,當分配給變、常數或傳遞給function時其內容會完全被複製,因此,當point2的值發生變化時,不會影響point1的值。
struct Point {
var x: Double
var y: Double
}
var point1 = Point(x: 0, y: 0)
var point2 = point1
point2.x = 1
class 在記憶體中被分配在heap
區塊,當被分配時,其本身的值不會被複製,而是複製新的reference,並共享值,因此,當point2的值發生變化時,point1也會被改變。
class Point {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
}
}
var point1 = Point(x: 0, y: 0)
var point2 = point1
point2.x = 1
Class支持繼承
在 Swift 中,只有 class 可以被繼承,struct 是不可以被繼承的,繼承是物件導向重要的特性,常見的例子是:一個自定義的view controller,它繼承自UIViewController。
class DemoViewController: UIViewController { }
是/否需要設定屬性初始值
使用class必須先初始化內容,而struct可以不賦初始值, 由memberwise initializer
自動生成。
Class的反初始化器(Deinitializer)
允許使用 deinit
方法在它被釋放之前執行額外的動作。
class Demo {
deinit {
// Deallocated from the heap, tear down things here
}
}
是/否能在方法中直接改自身屬性
class可以在自身方法中修改屬性,而struct不行,如果要修改必須加上mutating
關鍵字。
因為在swift中class是可變的(mutable)
,struct是不可變的(immutable)
,
差別是即使用 let 來做宣告class,還是可以修改class裡的任何屬性。
結論
大部分的情況下使用struct
👉🏼由於記憶體分配和管理的方式,使用struct內存效率更高、更容易地追蹤錯誤、 並且是thread-safe
👉🏼不需要繼承時,使用struct
👉🏼在處理一些相對簡單的資料結構時使用struct
👉🏼需要共享可變狀態(mutable state)時使用class
相關資源
🎬Understanding Swift Performance(WWDC 2016)
📃Choosing Between Structures and Classes
感謝您的閱讀,在下面留言,讓我知道你對這篇文章的看法,
追蹤我的instagram,獲得更多更即時的iOS開發資訊 >>>