位置:首頁 > 高級語言 > Swift教學 > Swift計算屬性

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封裝了一個widthheight
  • Rect表示一個有原點和尺寸的矩形

Rect也提供了一個名為center的計算屬性。一個矩形的中心點可以從原點和尺寸來算出,所以不需要將它以顯式聲明的Point來保存。Rect的計算屬性center提供了自定義的 getter 和 setter 來獲取和設置矩形的中心點,就像它有一個存儲屬性一樣。

例子中接下來創建了一個名為squareRect實例,初始值原點是(0, 0),寬度高度都是10。如圖所示藍色正方形。

squarecenter屬性可以通過點運算符(square.center)來訪問,這會調用 getter 來獲取屬性的值。跟直接返回已經存在的值不同,getter 實際上通過計算然後返回一個新的Point來表示square的中心點。如代碼所示,它正確返回了中心點(5, 5)

center屬性之後被設置了一個新的值(15, 15),表示向右上方移動正方形到如圖所示橙色正方形的位置。設置屬性center的值會調用 setter 來修改屬性originxy的值,從而實現移動正方形到新的位置。

Computed Properties sample

便捷 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的結構體,表示三維空間的立方體,包含widthheightdepth屬性,還有一個名為volume的隻讀計算屬性用來返回立方體的體積。設置volume的值毫無意義,因為通過widthheightdepth就能算出volume。然而,Cuboid提供一個隻讀計算屬性來讓外部用戶直接獲取體積是很有用的。