存儲(chǔ)屬性
作為實(shí)例一部分的常量或變量。
可以提供一個(gè)默認(rèn)值,或者在初始化過程中設(shè)置(或修改)屬性的值,對(duì)常量的存儲(chǔ)屬性也適用。
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
存儲(chǔ)屬性變量還可以是惰性的(用 lazy 關(guān)鍵字表征)。
存儲(chǔ)屬性常量是不可以的,因?yàn)槌A勘仨氃诔跏蓟瓿芍坝兄担栊郧笾悼赡馨l(fā)生在初始化完成之后。
計(jì)算屬性
計(jì)算屬性并不真的存儲(chǔ)一個(gè)值。TA們提供一個(gè) getter 和可選的 setter 間接獲取和設(shè)置其他屬性。
計(jì)算屬性必須使用 var 關(guān)鍵字定義。因?yàn)橛?jì)算屬性的值不是固定的,會(huì)根據(jù)計(jì)算而改變。
(let 關(guān)鍵字只用于常量屬性,來表征TA們的值在實(shí)例實(shí)例化之后不會(huì)再改變)
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,計(jì)算屬性就變成只讀的。
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
屬性觀察器
使用 willSet didSet。
可以給存儲(chǔ)屬性(惰性的除外)提供觀察器,或者是任何被重寫的繼承而來的屬性(無論是存儲(chǔ)屬性還是計(jì)算屬性)。
無需給非重寫的計(jì)算屬性提供觀察器,因?yàn)榭梢灾苯釉?setter 中對(duì)值改變做出反應(yīng)。
屬性初始化時(shí),觀察器不會(huì)被調(diào)用。
使用 willSet,新的值(自己定義一個(gè)名字,或者默認(rèn)使用newValue)會(huì)作為常量參數(shù)傳遞。
使用 DidSet,舊的值(自己定義一個(gè)名字,或者默認(rèn)使用oldValue)會(huì)作為常量參數(shù)傳遞。
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
println("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
println("Added \(totalSteps - oldValue) steps")
}
}
}
}
屬性與全局和局部變量
目前為止,遇到的變量(無論全局還是局部)都是存儲(chǔ)變量,和存儲(chǔ)屬性類似。
然而,也可以定義計(jì)算變量,或者為存儲(chǔ)變量提供觀察器。
不過,要注意,全局的常量和變量總是惰性求值的(無需用 lazy 表征),而局部的常量和變量絕不會(huì)惰性求值。
類屬性
為類本身定義屬性,
- 所有實(shí)例都可以使用的常量屬性(static constant in C),
- 所有實(shí)例都可見的變量屬性(static variable in C)。
對(duì)于值類型,存儲(chǔ)屬性和計(jì)算屬性都可以定義,使用 static 關(guān)鍵字。
對(duì)于引用類型,只可以定義計(jì)算屬性,使用 class 關(guān)鍵字。
對(duì)于存儲(chǔ)屬性,必須為其提供默認(rèn)值,畢竟,類型本身沒有初始化過程...
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
}
}