1. 程式人生 > >Swift開發筆記3.Swift中setter和getter的基本用法

Swift開發筆記3.Swift中setter和getter的基本用法

Swift中有儲存屬性和計算屬性兩種。其中在計算屬性中可以實現setter和getter方法,我們在playground中定義兩個結構體:

struct Point {
    var x = 0.0, y = 0.0
}

struct Size {
    var width = 0.0, hight = 0.0
}


假設這兩個結構體要實現一個畫圖的功能。point是起點,size是尺寸。可以看出point中有兩個座標點,size中描述了寬和高。像x、y這樣存值的屬性就是儲存屬性。然後我們建立一個Rect結構體,表示一個區域,注意結構體本身也是物件。Rect中建立了兩個實體,origin是Point型別,標示區域的原點,size是Size型別,標示區域的尺寸。

struct Rect {
    var origin = Point()
    var size = Size()
}

Swift中提供了延遲載入的功能,可以像下面這樣定義Rect的屬性:
 lazy  var size = Size()

使用延遲載入就表示當我們載入Rect物件的時候可能暫時用不到size物件,那麼就在需要載入size的時候再載入。

現在我在Rect中要求區域的中心點,中心點座標的值依賴於前面的兩個屬性origin和size,我們只有知道了原點和尺寸才能通過計算得到center的值。我們首先用方法來實現center的計算,getCenter方法返回的是中心點座標的元組。

struct Rect {
    var origin = Point()
    var size = Size()
    func getCenter() -> (Double,Double){
        let x = origin.x + (size.width / 2)
        let y = origin.y + (size.hight / 2)
        return (x,y)
    }
}


測試一下:
var rect = Rect(origin: Point(x: 100, y: 100), size: Size(width: 200, hight: 100))
var (x, y) = rect.getCenter()
println("\(x) , \(y)")


playground顯示:


如果沒有儲存屬性,那麼我們是用以上的方法來實現中心點的求值的。現在引入儲存屬性,命名為center,center標示中心點座標,它的值依賴於origin和size的值,center就是一個計算屬性,程式碼如下:

 var center : Point {
        get {
            let x = origin.x + (size.width / 2)
            let y = origin.y + (size.hight / 2)
            return Point(x:x, y:y)
        }
    }

然後呼叫它:
var p2 = rect.center
println("\(p2.x),\(p2.y)")

可以看到執行結果是相同的,我們在呼叫的時候看起來像是呼叫了rect的屬性center,實際是呼叫了cnter中的get方法.這個get方法就相當於一個getter,現在再來寫一個set方法,

set方法需要傳值,命名為newCenter。如果我們得到了一個新的中心點的值,那麼在尺寸不變的情況下原點座標可以被重新設定。這就需要一個set方法來實現,程式碼如下:

  set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.hight / 2)
        
        }

測試一下:
var p3 = Point(x: 300, y: 200)
rect.center = p3
println("\(rect.origin.x), \(rect.origin.y)")

結果如圖:


使用get和set更加方便,程式碼可讀性更高