Swift 的計算屬性 不直接存儲值,而是提供 getter 和可選的 setter 來間接獲取和設置其他屬性或值。結構體、類、枚舉均可定義計算屬性,相當於 Objective-C 中 getter/setter 合成的屬性。本文系統講解定義語法、枚舉/類實例、setter 簡化、只讀屬性等核心知識點。
[修飾符] var 屬性名: 類型 {
get {
// 必須返回值
}
set(參數名) { // 參數名可省略,默認 newValue
// 無返回值
}
}
enum Season {
case Spring, Summer, Fall, Winter
var info: String {
get {
print("正在執行 getter 方法")
switch self {
case .Spring: return "春暖花開"
default: return "此恨綿綿無絕期"
}
}
set(newValue) {
print("正在執行 setter 方法,傳入參數為: \(newValue)")
}
}
}
var s = Season.Spring
print(s.info) // 訪問 -> 調用 getter
s.info = "秋高氣爽" // 賦值 -> 調用 setter
class User {
var first: String = ""
var last: String = ""
var fullName: String {
get {
return first + "-" + last
}
set(newValue) {
let names = newValue.components(separatedBy: "-")
self.first = names[0]
self.last = names[1]
}
}
init(first: String, last: String) {
self.first = first
self.last = last
}
}
let user = User(first: "六小齡童", last: "孫悟空")
print(user.fullName) // 六小齡童-孫悟空
user.fullName = "甄子丹-悟空"
print(user.first) // 甄子丹
print(user.last) // 悟空
當 setter 參數名為默認 newValue 時,可省略參數聲明:
set {
let names = newValue.components(separatedBy: "-")
self.first = names[0]
self.last = names[1]
}
僅包含 getter 時,可省略 get 關鍵字和大括號:
var fullName: String {
return first + "-" + last
}
// 等價於
var fullName: String {
get { return first + "-" + last }
}
注意:即使是只讀屬性,也必須用 var 聲明,不可用 let。
| 特性 | 存儲屬性 | 計算屬性 |
|---|---|---|
| 本質 | 在內存中分配空間存值 | 不存值,通過代碼計算/轉發 |
| 聲明 | var/let 名: 類型 = 初值 | var 名: 類型 { get/set } |
| 觀察器 | 支持 willSet/didSet | 不支持(邏輯在 setter 中實現) |
| 適用場景 | 直接持有數據 | 衍生數據、封裝訪問邏輯、跨屬性聯動 |
計算屬性是 Swift 封裝與抽象的強大工具:
善用計算屬性,能讓模型層邏輯更內聚、介面更乾淨。