Swift 物件屬性 (Properties)

屬性將值與特定的類別 (Class)、結構 (Struct) 或列舉 (Enum) 關聯起來。

儲存屬性 (Stored Properties)

這是最常見的形式,直接儲存一個常量或變數作為實例的一部分。

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)

延遲儲存屬性 (Lazy Stored Properties)

使用 lazy 關鍵字宣告。這些屬性直到第一次被存取時依才會被計算初始值。這對於初始化很耗時的操作 (如讀取設定檔、下載圖片) 非常有用。

lazy var importer = DataImporter()
Lazy 屬性必須宣告為變數 (var),因為它在實例初始化完成後才可能被賦值。

計算屬性 (Computed Properties)

這些屬性不直接儲存值,而是提供一個 getter 和一個可選的 setter 來間接存取。

struct Point { var x = 0.0, y = 0.0 }
struct Size { var width = 0.0, height = 0.0 }

struct Rect {
    var origin = Point()
    var size = Size()
    
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

屬性觀察者 (Property Observers)

你可以監聽屬性值的變化,並在變化前後執行程式碼。常用於 UI 更新。

  • willSet:值被儲存呼叫。
  • didSet:值被儲存呼叫 (最常用)。
class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("即將設定為 \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("增加了 \(totalSteps - oldValue) 步")
            }
        }
    }
}

型別屬性 (Type Properties)

類似於其他語言的 static 變數。這些屬性屬於型別本身,而不是屬於某個實例。所有實例共享同一個型別屬性。

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}

print(SomeStructure.storedTypeProperty)