Swift 類別(class)及結構(structure) — DAY7

工程師卡卡
5 min readMay 27, 2021

Swift 提供了兩個型別語法:類別(class)及結構(structure),可以讓你將多個相關的函式及值儲存在內,以及更多的特性。

定義一個類別及結構分別要使用classstruct關鍵字,並接著一組大括號{},格式如下:

class 類別名稱 {
類別內的屬性、方法及其他可以定義在內的特性
}
struct 結構名稱 {
結構內的屬性、方法及其他可以定義在內的特性
}

大駝峰式命名法來為類別與結構命名,以符合標準 Swift 型別的大寫命名風格(像是StringInt)。相對地,使用小駝峰式命名法為屬性與方法命名(與常數、變數及函式相同),以便與類別區分。

類別(class)及結構(structure)兩個型別的差別

  • struct 該變數/常數所容納的會是該實體的所有內容,也就是copy產生一個實體且佔位,為值型別,像是基本型別:String, Double,Boolean…等等。
  • class 這個變數/常數就只會容納存放該實體的位址,為參考型別,引用實體本身,要改變全部一起改變

也就是,如果它的型別是 struct 的話,我們在操作的實體都會是本地的。但是當我們在操作 class 型別的變數/常數的話,那麼我們實際上是透過變數/常數在操作一個遠端的實體

實體(instance)依照規格建立一個東西(!?),struct跟class使用建構氣來生成,也就是在後面加上( ),可初始化帶入值,也可以不帶入任何的東西使用原本的值。

做出一個型別 > 建立一個實體 > 藉由實體取得屬性(dot)

class characterStates(){
let apple = 100
}
let someStates = characterStates(); //建立一個實體print(someStates.apple)
//100
// 用 struct 定義 Dog。
struct Dog {
var name = "Bart"
}

// 整個 Dog 實體都會被存到 myDog 裡。
var myDog = Dog()

var herDog = Dog() {
// 如果 herDog 有變動的話就顯示訊息。
didSet {
print("Her dog is changed!")
}
}

herDog.name = "Starlord"
// Her dog is changed!
// 用 class 定義 Cat。
class Cat {
var name = "Mimi"
}
// myCat 只會儲存 Cat 實體的位址。Cat 實體本身會被存到別的地方。var myCat = Cat()var herCat = Cat() {
didSet {
print("Her cat is changed!")
}
}

herCat.name = "Mumu"
// 沒有訊息。

建議使用struct:

  1. 資料量少且結構簡單
  2. 需要複製另一個實體
  3. 不繼承另一個已存在型別的屬性及類別

其他則建議用類別。

MVC的架構

MVC(Model — View — Controller)架構中:

  • Model:不是一個單一的物件,而是一整個層,裡面可能包含了文件(資料物件管理者)資料物件這兩種元件。
  • View:幫助Controller實現它的功能,通常View內包含通用的元件,例如UIButton、UITableView…等。
  • Controller:如何與view跟model溝通
  1. Controller → Model:Controller有絕對的權限可以與Model溝通,因為Controller最主要的工作就是把Model資料呈現到View。
  2. Controller → View:同樣地,既然Controller需要將資料呈現到View,跟View溝通當然也沒有問題。可以把View視為Controller的下屬,Controller為其長官,長官當然可以直接跟下屬溝通!連結Controller與View溝通的元件,我們稱為Outlet。
  3. View → Controller:View既然為Controller工作,當然也要能夠與Controller溝通。不過這裡面有個問題,View 裡面大部分是Apple開發好通用的元件,而且在MVC架構中,我們讓View的元件儘量可以再利用(reuse),這時候我們需要利用已制定好的結構化的機制和Controller溝通。
struct(圖左),class(圖右)

首先文件必須要有一個持續存在的實體,如此才能夠隨時通知 controller 資料的變動,並且進行非同步或甚至自動的資料更新,但如上圖,struct會瘋狂複製出新的實體,class是引入實體位置,因此文件定義成 class 會是比較合理的做法,因為它肩負了許多溝通的工作。資料物件則是資料的代表,要用 class 或 struct 來定義都可以,

參考:https://www.appcoda.com.tw/swift-class/

--

--

工程師卡卡
工程師卡卡

Written by 工程師卡卡

Frontend developer Swift baby level

No responses yet