標籤:swift
屬性
屬性是依賴於某個特定的類、結構體或者枚舉類型的值。Swift有兩種屬性:儲存類型和計算類型。其中儲存類型可以作為執行個體的一部分存放變數或者常量的值,而計算類型的屬性值是通過運算的來的。計算類型的屬性可以在類、結構體和枚舉類型中出現,但儲存類型只可能出現在類和結構體類型中。
屬性一般依賴於一個特定類型的執行個體,但是也可以依賴於類本身。依賴於類型本身的屬性稱為類型屬性。
可以定義屬性觀察者來監督屬性值的改變,從而作出響應。對集合不明白的看集合類型-數組詳解
儲存屬性
常量屬性let的值在初始化後不能在改變,而變數屬性var的值可以隨時更改。
1234567 |
structFixedLengthRange { varfirstValue:Int letlength:Int} var rangeOfThreeItems= FixedLengthRange(firstValue:0,length:3)rangeOfThreeItems.firstValue= 6 |
結構體常量的儲存屬性
如果一個結構體執行個體被賦值給一個常量,則這個執行個體所擁有的儲存類型的屬性都不能在改變,包括變數屬性在內。
123 |
letrangeOfFourItems = FixedLengthRange(firstValue:0,length:4)rangeOfFourItems.firstValue= 6//編譯錯誤,firstValue的值不能改變 |
延時儲存屬性
延時儲存屬性的初始值直到第一次使用的時候才進行計算,在聲明時通過@lazy進行標記。
提示
一定要將延時儲存屬性聲明為變數(var),因為它的初始值可能會在執行個體初始化完成後才有,而常量屬性一般在執行個體初始化完成之前就會有值。
當屬性的初始值依賴於外部銀子,並且該因子的值在執行個體初始化完成之前不確定時,延時屬性非常有用。如果屬性初始化時需要進行大量的計算,也可以考慮使用延時屬性。
下面是延時屬性的樣本:
123456789101112131415161718 |
classDataImporter { /* DataImporter是一個從外部檔案匯入資料的類。假設它需要花費較多的時間進行初始化 */ varfileName ="data.txt" //DataImporter類的資料匯入功能} classDataManager { @lazyvar importer= DataImporter() vardata =String[]() //DataManager類提供資料管理功能} letmanager =DataManager()manager.data+= "Some data"manager.data+= "Some more data"//DataImporter執行個體還沒有建立 |
只有問DataManager的importer屬性時才會去建立這個對象。
12 |
println(manager.importer.filename)//建立importer屬性並列印“data.txt" |
儲存屬性與執行個體變數
Objective-C類的對象可以使用屬性或者執行個體變數來儲存值。Swift中並沒有所謂的執行個體變數,而是將它們統一為屬性了,這樣使得屬性的聲明更加簡化。
計算屬性
除了儲存屬性外,類、結構體和枚舉類型還可以定義計算屬性。這些計算屬性並不能夠儲存值,而是通過getter方法和可選的setter方法來間接的擷取和設定其它屬性和值。
123456789101112131415161718192021222324252627282930 |
structPoint { varx =0.0,y =0.0} structSize { varwidth =0.0,height =0.0} structRect { varorigin =Point() varsize =Size() varcenter:Point { get{ let centerX= origin.x+ (size.width/ 2) letcenterY =origin.y+ (size.height/ 2) returnPoint(x:centerX,y:centerY) } set(newCenter){ origin.x= newCenter.x- (size.width/ 2) origin.y= newCenter.y- (size.height/ 2) } }}varsquare =Rect(origin:Point(x:0.0,y:0.0), size:Size(width:10.0,height:10.0))letinitialSquareCenter = square.centersquare.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)“ |
這個例子定義了三個結構體來表示幾何形狀:
- Point封裝了(x, y)座標。
- Size封裝了寬度和高度。
- Rect用座標原點和大小定義一個矩形。
其中Rect結構體還提供了一個center的計算屬性。這個屬性的值是由矩形的origin和size屬性決定的,它本身並不需要儲存資訊。但是改變center的值,會間接的修改矩形的其它屬性。