存儲(chǔ)屬性
作為實(shí)例一部分的常量或變量锥涕。
可以提供一個(gè)默認(rèn)值扶认,或者在初始化過(guò)程中設(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)鍵字只用于常量屬性魏蔗,來(lái)表征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ǔ)屬性(惰性的除外)提供觀察器,或者是任何被重寫(xiě)的繼承而來(lái)的屬性(無(wú)論是存儲(chǔ)屬性還是計(jì)算屬性)帚稠。
無(wú)需給非重寫(xiě)的計(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")
}
}
}
}
屬性與全局和局部變量
目前為止,遇到的變量(無(wú)論全局還是局部)都是存儲(chǔ)變量减细,和存儲(chǔ)屬性類似匆瓜。
然而,也可以定義計(jì)算變量未蝌,或者為存儲(chǔ)變量提供觀察器驮吱。
不過(guò),要注意萧吠,全局的常量和變量總是惰性求值的(無(wú)需用 lazy
表征)左冬,而局部的常量和變量絕不會(huì)惰性求值。
類屬性
為類本身定義屬性纸型,
- 所有實(shí)例都可以使用的常量屬性(static constant in C)拇砰,
- 所有實(shí)例都可見(jiàn)的變量屬性(static variable in C)梅忌。
對(duì)于值類型,存儲(chǔ)屬性和計(jì)算屬性都可以定義除破,使用 static
關(guān)鍵字牧氮。
對(duì)于引用類型,只可以定義計(jì)算屬性瑰枫,使用 class
關(guān)鍵字踱葛。
對(duì)于存儲(chǔ)屬性,必須為其提供默認(rèn)值光坝,畢竟剖毯,類型本身沒(méi)有初始化過(guò)程...
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
}
}