存儲屬性
作為實例一部分的常量或變量。
可以提供一個默認值,或者在初始化過程中設置(或修改)屬性的值,對常量的存儲屬性也適用。
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// the range represents integer values 0, 1, and 2
rangeOfThreeItems.firstValue = 6
// the range now represents integer values 6, 7, and 8
存儲屬性變量還可以是惰性的(用 lazy
關鍵字表征)。
存儲屬性常量是不可以的,因為常量必須在初始化完成之前有值,而惰性求值可能發生在初始化完成之后。
計算屬性
計算屬性并不真的存儲一個值。TA們提供一個 getter
和可選的 setter
間接獲取和設置其他屬性。
計算屬性必須使用 var
關鍵字定義。因為計算屬性的值不是固定的,會根據計算而改變。
(let
關鍵字只用于常量屬性,來表征TA們的值在實例實例化之后不會再改變)
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)
}
}
}
// newValue is used if a name for the new value is not set.
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)
}
}
}
去除 setter
,計算屬性就變成只讀的。
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
屬性觀察器
使用 willSet
didSet
。
可以給存儲屬性(惰性的除外)提供觀察器,或者是任何被重寫的繼承而來的屬性(無論是存儲屬性還是計算屬性)。
無需給非重寫的計算屬性提供觀察器,因為可以直接在 setter
中對值改變做出反應。
屬性初始化時,觀察器不會被調用。
使用 willSet
,新的值(自己定義一個名字,或者默認使用newValue
)會作為常量參數傳遞。
使用 DidSet
,舊的值(自己定義一個名字,或者默認使用oldValue
)會作為常量參數傳遞。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
println("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
println("Added \(totalSteps - oldValue) steps")
}
}
}
}
屬性與全局和局部變量
目前為止,遇到的變量(無論全局還是局部)都是存儲變量,和存儲屬性類似。
然而,也可以定義計算變量,或者為存儲變量提供觀察器。
不過,要注意,全局的常量和變量總是惰性求值的(無需用 lazy
表征),而局部的常量和變量絕不會惰性求值。
類屬性
為類本身定義屬性,
- 所有實例都可以使用的常量屬性(static constant in C),
- 所有實例都可見的變量屬性(static variable in C)。
對于值類型,存儲屬性和計算屬性都可以定義,使用 static
關鍵字。
對于引用類型,只可以定義計算屬性,使用 class
關鍵字。
對于存儲屬性,必須為其提供默認值,畢竟,類型本身沒有初始化過程...
struct SomeStructure {
static var storedTypeProperty = "Some value."
static let storedConstantTypeProperty = "Some value"
static var computedTypeProperty: Int {
// return an Int value here
}
}
enum SomeEnumeration {
static var storedTypeProperty = "Some value."
static let storedConstantTypeProperty = "Some value"
static var computedTypeProperty: Int {
// return an Int value here
}
}
class SomeClass {
class var computedTypeProperty: Int {
// return an Int value here
}
}