Swift研究之編程進階教程(二)屬性,儲存屬性詳解

來源:互聯網
上載者:User

標籤: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的值,會間接的修改矩形的其它屬性。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.