Swift計算屬性
計算屬性
除存儲屬性外,類、結構體和枚舉可以定義計算屬性,計算屬性不直接存儲值,而是提供一個 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)
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
println("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// 輸出 "square.origin is now at (10.0, 10.0)」
這個例子定義了 3 個幾何形狀的結構體:
-
Point
封裝了一個(x, y)
的座標 -
Size
封裝了一個width
和height
-
Rect
表示一個有原點和尺寸的矩形
Rect
也提供了一個名爲center
的計算屬性。一個矩形的中心點可以從原點和尺寸來算出,所以不需要將它以顯式聲明的Point
來保存。Rect
的計算屬性center
提供了自定義的 getter 和 setter 來獲取和設置矩形的中心點,就像它有一個存儲屬性一樣。
例子中接下來創建了一個名爲square
的Rect
實例,初始值原點是(0, 0)
,寬度高度都是10
。如圖所示藍色正方形。
square
的center
屬性可以通過點運算符(square.center
)來訪問,這會調用 getter 來獲取屬性的值。跟直接返回已經存在的值不同,getter 實際上通過計算然後返回一個新的Point
來表示square
的中心點。如代碼所示,它正確返回了中心點(5, 5)
。
center
屬性之後被設置了一個新的值(15, 15)
,表示向右上方移動正方形到如圖所示橙色正方形的位置。設置屬性center
的值會調用 setter 來修改屬性origin
的x
和y
的值,從而實現移動正方形到新的位置。
便捷 setter 聲明
如果計算屬性的 setter 沒有定義表示新值的參數名,則可以使用默認名稱newValue
。下面是使用了便捷 setter 聲明的Rect
結構體代碼:
struct AlternativeRect {
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 {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
只讀計算屬性
只有 getter 沒有 setter 的計算屬性就是只讀計算屬性。只讀計算屬性總是返回一個值,可以通過點運算符訪問,但不能設置新的值。
<<<<<<< HEAD
注意:
必須使用
var
關鍵字定義計算屬性,包括只讀計算屬性,因爲他們的值不是固定的。let
關鍵字只用來聲明常量屬性,表示初始化後再也無法修改的值。注意:
必須使用
var
關鍵字定義計算屬性,包括只讀計算屬性,因爲它們的值不是固定的。let
關鍵字只用來聲明常量屬性,表示初始化後再也無法修改的值。a516af6a531a104ec88da0d236ecf389a5ec72af
只讀計算屬性的聲明可以去掉get
關鍵字和花括號:
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
println("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// 輸出 "the volume of fourByFiveByTwo is 40.0"
這個例子定義了一個名爲Cuboid
的結構體,表示三維空間的立方體,包含width
、height
和depth
屬性,還有一個名爲volume
的只讀計算屬性用來返回立方體的體積。設置volume
的值毫無意義,因爲通過width
、height
和depth
就能算出volume
。然而,Cuboid
提供一個只讀計算屬性來讓外部用戶直接獲取體積是很有用的。