除存儲(chǔ)屬性外,類、結(jié)構(gòu)體和枚舉可以定義計(jì)算屬性,計(jì)算屬性不直接存儲(chǔ)值,而是提供一個(gè) getter 來(lái)獲取值,一個(gè)可選的 setter 來(lái)間接設(shè)置其他屬性或變量的值。
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)”
這個(gè)例子定義了 3 個(gè)幾何形狀的結(jié)構(gòu)體:
Point封裝了一個(gè)(x, y)的坐標(biāo)Size封裝了一個(gè)width和heightRect表示一個(gè)有原點(diǎn)和尺寸的矩形
Rect也提供了一個(gè)名為center的計(jì)算屬性。一個(gè)矩形的中心點(diǎn)可以從原點(diǎn)和尺寸來(lái)算出,所以不需要將它以顯式聲明的Point來(lái)保存。Rect的計(jì)算屬性center提供了自定義的 getter 和 setter 來(lái)獲取和設(shè)置矩形的中心點(diǎn),就像它有一個(gè)存儲(chǔ)屬性一樣。
例子中接下來(lái)創(chuàng)建了一個(gè)名為square的Rect實(shí)例,初始值原點(diǎn)是(0, 0),寬度高度都是10。如圖所示藍(lán)色正方形。
square的center屬性可以通過(guò)點(diǎn)運(yùn)算符(square.center)來(lái)訪問,這會(huì)調(diào)用 getter 來(lái)獲取屬性的值。跟直接返回已經(jīng)存在的值不同,getter 實(shí)際上通過(guò)計(jì)算然后返回一個(gè)新的Point來(lái)表示square的中心點(diǎn)。如代碼所示,它正確返回了中心點(diǎn)(5, 5)。
center屬性之后被設(shè)置了一個(gè)新的值(15, 15),表示向右上方移動(dòng)正方形到如圖所示橙色正方形的位置。設(shè)置屬性center的值會(huì)調(diào)用 setter 來(lái)修改屬性origin的x和y的值,從而實(shí)現(xiàn)移動(dòng)正方形到新的位置。

如果計(jì)算屬性的 setter 沒有定義表示新值的參數(shù)名,則可以使用默認(rèn)名稱newValue。下面是使用了便捷 setter 聲明的Rect結(jié)構(gòu)體代碼:
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 的計(jì)算屬性就是只讀計(jì)算屬性。只讀計(jì)算屬性總是返回一個(gè)值,可以通過(guò)點(diǎn)運(yùn)算符訪問,但不能設(shè)置新的值。
<<<<<<< HEAD
注意:必須使用
var關(guān)鍵字定義計(jì)算屬性,包括只讀計(jì)算屬性,因?yàn)樗麄兊闹挡皇枪潭ǖ摹?code style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: inherit; padding: 0px 5px; color: rgb(199, 37, 78); background-color: rgb(248, 248, 248); white-space: nowrap; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; margin: 0px 2px; border: 1px solid rgb(234, 234, 234);">let關(guān)鍵字只用來(lái)聲明常量屬性,表示初始化后再也無(wú)法修改的值。注意:
必須使用
var關(guān)鍵字定義計(jì)算屬性,包括只讀計(jì)算屬性,因?yàn)樗鼈兊闹挡皇枪潭ǖ摹?code style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; -webkit-font-smoothing: antialiased; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; font-size: 13px; padding: 0px 5px; color: rgb(199, 37, 78); background-color: rgb(248, 248, 248); white-space: nowrap; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; margin: 0px 2px; border: 1px solid rgb(234, 234, 234);">let關(guān)鍵字只用來(lái)聲明常量屬性,表示初始化后再也無(wú)法修改的值。a516af6a531a104ec88da0d236ecf389a5ec72af
只讀計(jì)算屬性的聲明可以去掉get關(guān)鍵字和花括號(hào):
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"
這個(gè)例子定義了一個(gè)名為Cuboid的結(jié)構(gòu)體,表示三維空間的立方體,包含上一篇:swift分號(hào)下一篇:Swift函數(shù)