昨天,我們學會了如何用 函式(Functions) 來打造可重複使用的「程式積木」,將特定的功能打包起來。
但如果我們想描述一個真實世界的物件,例如一位「玩家」,他不僅有資料(名字、等級),還有功能(攻擊、回血),該怎麼辦?
今天,我們就要從打造「功能積木」升級為繪製「物件藍圖」!我們將學習 Swift 中用來創造自訂資料型別的兩大核心:struct
(結構體) 和 class
(類別)。學會它們,你就能將資料與功能完美地打包在一起,為任何事物建立清晰的模型。
struct
與 class
的宣告、實體化與屬性存取===
與 !==
來判斷兩個參考是否指向同一個實體struct
、何時該用 class
的設計原則struct Point {
var x = 0.0
var y = 0.0
}
class Car {
var brand: String?
var year: Int?
}
定義好後,就可以透過「實體化」創造具體的物件,並使用點語法來存取屬性:
let origin = Point()
let myCar = Car()
print(origin.x) // 0.0
myCar.brand = "Tesla"
print(myCar.brand ?? "未知品牌") // "Tesla"
結構有系統自動提供的建構器,可以直接指定每個屬性:
let myPoint = Point(x: 10, y: 20)
print(myPoint.x) // 10.0
類別沒有這個自動生成的成員逐一建構器功能。
複製的是資料本身,各自獨立:
var a = Point(x: 10, y: 20)
var b = a
b.y = 50
print(a.y) // 20.0
複製的是「參考」,會共用同一份資料:
let myCar = Car()
myCar.brand = "Honda"
let sameCar = myCar
let anotherCar = Car()
anotherCar.brand = "Honda"
if myCar === sameCar {
print("myCar 和 sameCar 是同一個實體")
}
if myCar !== anotherCar {
print("myCar 和 anotherCar 是不同的實體")
}
===
:判斷是否為同一個實體!==
:判斷是否不是同一個實體
==
用於判斷兩個值是否相等,而===
則用於判斷兩個參考是否指向同一個實體
Swift 建議:能用 struct
就用 struct
,除非有這些需求:
class
的情況:struct
的情況:今天我們掌握了 Swift 中用來打造自訂資料型別的兩大藍圖:struct
(結構體) 與 class
(類別)。我們學會了如何定義它們、建立實體,並存取其內部的屬性。
最重要的是,我們深入理解了兩者最根本的差異:「struct
是值型別,複製時各自獨立;class
是參考型別,複製時共享同一份資料」。同時,我們也學會了如何用 ===
判斷實體同一性,並掌握了在不同情境下如何做出正確的選擇。
我們已經學會用 struct
和 class
來打包「資料」,但如果連「功能」本身都能打包,放進背包隨身攜帶,甚至當作參數傳遞呢?
這就是 Swift 的一項超強武器: 閉包 (Closure)!閉包能讓我們把一段程式碼(也就是功能)像 Int
或 String
一樣裝進變數裡,隨傳隨用。
明天,你將學會如何定義和使用這種「匿名的便攜式函式」,並見識它如何讓陣列的排序、篩選等操作變得無比精煉。準備好讓你的程式碼變得更靈活、更強大吧!
敬請期待《Day 13|Swift 閉包入門:寫出精煉又強大的程式!》