Swift

2023 年 10 月 5 日

Swift 語言中的 Computed Properties

已複製到剪貼板


Swift 語言中的 Properties 可分成:會儲存資料的 Stored Properties 和不會儲存資料的 Computed Properties,雖然 Computed Properties 不會儲存資料,但卻能根據我們的指定的邏輯,在取值或設定時做些計算。

Swift Properties

Swift 語言中的 Computed Properties

Computed Properties 提供了一個 getter 和一個可無的 setter,來操作其他的 Stored Properties。

這裡用正方形的 struct 來舉例:

/// 點座標型別
struct Point {
    var x, y: Double
}
/// 正方形型別
struct Rect {
    /// 左下角的頂點座標位置
    var origin = Point(x: 0, y: 0)
    /// 邊長大小
    var size = 10.0
    /// 中心點的座標位置
    var center: Point {
        get {
            Point(x: origin.x + size/2, y: origin.y + size/2)
        }
        set(newCenter) {
            origin = Point(x: newCenter.x - size/2, y: newCenter.y - size/2)
        }
    }
}

變數 center 是一個有 getter 與 setter 的 Computed Property,因為中心點座標可以由左下角頂點座標和邊長計算出來,所以我們不需要一個變數來儲存中心點座標,可以在取值時,都去拿左下角頂點座標和邊長大小,計算完再回傳。

備註

Getter 裡因為只有一行,所以我們可以省略 return,Swift 知道要把這一行的值 return。但如果有多行時,記得把要回傳的值特別寫 return。

使用 Stored Property 與 Computed Property 的差異

這裡如果不用 Computed Property 而用 Stored Property,會有個壞處是,我們必須在每次更新左下角頂點座標或邊長時,都要記得也去更新它的中心點座標,不然之後取中心點座標時,就會是錯的資料,但如果使用 Computed Property 的話,就不需要擔心,因為它永遠會用當前的資料做計算後回傳。

Computed Property 可有可無的 Setter

另外,Computed Property 是可以沒有 setter 的,如果一個 Computed Property 沒有 setter,我們就不能對它做設定,只能取值。而以這裡的例子,因為有 setter,所以我們也能直接設定它,透過設定 Computed Property 來連動所有相關的 Stored Property,這讓 Computed Property 用起來就像一般的 Stored Property。

簡化 Computed Property 的 Setter

同樣以上面正方形型別的例子,Setter 定義了新的值的變數名稱為「newCenter」。

/// 中心點的座標位置
var center: Point {
    get {
        Point(x: origin.x + size/2, y: origin.y + size/2)
    }
    set(newCenter) {
        origin = Point(x: newCenter.x - size/2, y: newCenter.y - size/2)
    }
}

而其實 Setter 並不需要幫新的值取變數名稱,因為取變數名稱是寫程式最難的部分。有預設的名稱是「newValue」,這裡的 Setter 可以簡化成:

/// 中心點的座標位置
var center: Point {
    get {
        Point(x: origin.x + size/2, y: origin.y + size/2)
    }
    set {
        origin = Point(x: newValue.x - size/2, y: newValue.y - size/2)
    }
}

唯獨的 Computed Property

如同上面已經有先提到過的,Computed Property 如果沒定義 Setter 的話,它就只能取值,不能被設定。

備註

Computed Property 必須被定義成 var,因為它總是透過其他人的值所算出來的,值並不是固定的。let 只能用在定義常數。

一個唯獨的 Computed Property 除了直接拿掉 Setter 外,還可以進一步簡化,也把 get 大括號拿掉:

/// 中心點的座標位置
var center: Point {
    Point(x: origin.x + size/2, y: origin.y + size/2)
}

當 Computed Property 沒特別寫 setter 與 getter 時,Swift 會預設這個值就是 getter 要回傳的。

分享文章

已複製到剪貼板

主題文章

查看 Swift

超級感謝

關於 XcodeProject

XcodeProject 創立於 2023,致力於協助開發者探索 Apple 的創新世界,學習在 iOS、iPadOS、macOS、tvOS、visionOS 與 watchOS 上開發 App,發現眾多技術與框架,讓開發者獲得更多能力。


Contacts

Ricky Chuang

XcodeProject

RickyChuang.xcodeproj@gmail.com

XcodeProject 聯絡

contact.xcodeproj@gmail.com

最新文章