Swift開發筆記3.Swift中setter和getter的基本用法
阿新 • • 發佈:2018-12-31
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更加方便,程式碼可讀性更高