儲存屬性:儲存常量或變數作為例項的一部分
,計算屬性計算(而不是儲存)乙個值。
計算屬性:可以用於類、結構體和列舉裡
,儲存屬性只能用於類和結構體.
儲存屬性
簡單來說,乙個儲存屬性就是儲存在特定類或結構體的例項裡的乙個常量或變數,儲存屬性可以是變數儲存屬性(用關鍵字
var定義),也可以是常量儲存屬性(用關鍵字
let定義)。
可以在定義儲存屬性的時候指定預設值。
struct fixedlengthrange
var rangeofthreeitems = fixedlengthrange(firstvalue: 0, length: 3)
//該區間表示整數0,1,2
rangeofthreeitems.firstvalue = 6
// 該區間現在表示整數6,7,8
//如果建立了乙個結構體的例項並賦值給乙個常量,則無法修改例項的任何屬性,即使定義了變數儲存屬性
let rangeoffouritems = fixedlengthrange(firstvalue: 0, length: 4)
// 該區間表示整數0,1,2,3
= 6
// 儘管firstvalue是變數屬性,這裡還是會報錯
//這種行為是由於結構體(struct)屬於值型別。當值型別的例項被宣告為常量的時候,它的所有屬性也就成了常量。
//屬於引用型別的類(class)則不一樣,把乙個引用型別的例項賦給乙個常量後,仍然可以修改例項的變數屬性。
延遲儲存屬性
延遲儲存屬性是指當第一次被呼叫的時候才會計算其初始值的屬性。在屬性宣告前使用
lazy
來標示乙個延遲儲存屬性。
注意:必須將延遲儲存屬性宣告成變數(使用
var關鍵字),因為屬性的值在例項構造完成之前可能無法得到。而常量屬性在構造過程完成之前必須要有初始值,因此無法宣告成延遲屬性。
延遲屬性很有用,當屬性的值依賴於在例項的構造過程結束前無法知道具體值的外部因素時,或者當屬性的值需要複雜或大量計算時,可以只在需要的時候來計算它。
下面的例子使用了延遲儲存屬性來避免複雜類的不必要的初始化。例子中定義了
dataimporter
和datamanager
兩個類,下面是部分**:
class dataimporter
class datamanager
let manager = datamanager()
// datamanager的 importer 屬性還沒有被建立
//由於使用了lazy,datamanager的importer屬性只有在第一次被訪問的時候才被建立。比如訪問它的屬性filename時:
println(manager.importer.filename)
除了儲存屬性,類、結構和列舉能夠定義計算屬性。計算屬性並不儲存值,它提供
getter
和可選的
setter
來間接地獲取和設定其它的屬性和值。
struct point
struct size
struct rect
set(newcenter)
}}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))")
// prints "square.origin is now at (10.0, 10.0)"
分析
:定義了乙個名為
square
的rect
變數,它的中心點初始化為(0,
0),高度和寬度初始化為
10,定義了乙個
initialsquarecenter
常量,通過
square.center
的getter
方法得到值
(5,5),
在通過setter
方法將center
屬性設定值為
(15,15) .
改變origin
中座標x和y
的值 setter
宣告的簡略寫法
如果計算屬性的
setter
方法沒有將被設定的值定義乙個名稱,將會預設地使用
newvalue
這個名稱來代替。下面的例子採用了這樣一種特性,定義了
rect
結構的新版本
:
struct alternativerect
set
}}
唯讀計算屬性
唯讀計算屬性只帶有乙個
getter
方法,通過點操作符,可以放回屬性值,但是不能修改它的值。 注意
:應該使用
var關鍵字將計算屬性-包含唯讀計算屬性-定義成變數屬性,因為它們的值並不是固定的。
let關鍵字只被常量屬性所使用,以表明一旦被設定它們的值就是不可改變的了
通過移除
get關鍵字和它的大括號,可以簡化唯讀計算屬性的定義:
struct cuboid
}let fourbyfivebytwo = cuboid(width: 4.0, height: 5.0, depth: 2.0)
println("the volume of fourbyfivebytwo is \(fourbyfivebytwo.volume)")
// prints "the volume of fourbyfivebytwo is 40.0"
屬性觀察者
property observers
屬性觀察者觀察屬性值的改變並對此做出響應。當設定屬性的值時,屬性觀察者就被呼叫,即使當新值同原值相同時也會被呼叫。
除了懶惰儲存屬性,你可以為任何儲存屬性加上屬性觀察者定義。另外,通過重寫子類屬性,也可以繼承屬性(儲存或計算)加上屬性觀察者定義。屬性重寫在「重寫
」章節定義。
注意:不必為未重寫的計算屬性定義屬性觀察者,因為可以通過它的
setter
方法直接對值的改變做出響應
定義屬性的觀察者時,你可以單獨或同時使用下面的方法:
willset
:設定值前被呼叫
didset
:設定值後立刻被呼叫
當實現willset
觀察者時,新的屬性值作為常量引數被傳遞。你可以為這個引數起乙個名字,如果不的話,這個引數就預設地被命名成
newvalue。
在實現didset
觀察者時也是一樣,只不過傳遞的產量引數表示的是舊的屬性值。
注意:屬性初始化時,
willset
和didset
並不會被呼叫。只有在初始化上下文之外,當設定屬性值時才被呼叫
下面是乙個
willset
和didset
用法的例項。定義了乙個類
stepcounter
,用來統計人走路時的步數。它可以從計步器或其它計數器上獲取輸入資料,對日常聯絡鍛鍊的步數進行追蹤。
class stepcounter
didset }}
}let stepcounter = stepcounter()
stepcounter.totalsteps = 200
// about to set totalsteps to 200
// added 200 steps
stepcounter.totalsteps = 360
// about to set totalsteps to 360
// added 160 steps
stepcounter.totalsteps = 896
// about to set totalsteps to 896
// added 536 steps
注意:如果通過
didset
來設定屬性的值,即使屬性值剛剛被設定過,起作用的也將會是
didset
,即新值是
didset
設定的值
Swift學習筆記 屬性
定義乙個屬性 struct fixedlengthrange fixedlengthrange這個類裡面有兩個屬性,乙個為 firstvalue int 為可變型別,另外乙個為 length 為不可變型別 屬性賦值 var rangeofthreeitems fixedlengthrange fir...
Swift學習筆記 屬性
屬性分為儲存屬性與計算屬性,儲存屬性可以有預設值,計算屬性則根據已有資訊返回某種計算結果。類,結構體,列舉都可以有屬性 不使用 獲取值的屬性都是基本儲存屬性,包括讀寫屬性 var 宣告 以及唯讀屬性 let宣告 和巢狀函式一樣,型別也可以巢狀 class person 顏色 var color co...
Swift學習筆記 屬性
swift中屬性是描述特定類 結構或者列舉的值,可以分為以下幾種 1.儲存屬性 stored properties 2.計算屬性 computed properties 3.型別屬性 type properties 儲存屬性 儲存屬性就是例項物件的該屬性不需要自己額外實現方法,直接簡單明瞭 訪問原始...