Swift 語言提供了類,枚舉或結(jié)構(gòu)相關(guān)聯(lián)值的屬性。屬性可以被進一步分為存儲屬性和計算屬性。
存儲性能和計算屬性的區(qū)別
存儲屬性 | 計算屬性 |
存儲常量和變量值的實例 | 計算的值,而不是存儲的值 |
通過類和結(jié)構(gòu)提供 | 通過類,枚舉和結(jié)構(gòu)提供 |
這兩種存儲和計算屬性與實例類型相關(guān)聯(lián)。當屬性與它的類型值相關(guān)聯(lián),那么它定義為“類型屬性”。存儲和計算的屬性通常與一個特定類型的實例相關(guān)聯(lián)。然而,屬性也可以與類型本身相關(guān)聯(lián)。這樣的屬性是已知的類型的屬性。 屬性觀察者也被使用
觀察存儲的屬性值
觀察子類從父繼承而得的屬性
Swift 介紹存儲的屬性概念用來存儲常量和變量的實例。常量存儲的屬性由 'let' 關(guān)鍵字定義和存儲變量的屬性由 “var” 關(guān)鍵字定義。
在定義存儲的屬性提供了“默認值”
在初始化期間用戶可以初始化和修改初始值
structNumber{var digits:Intlet pi =3.1415}var n =Number(digits:12345) n.digits =67 println("\(n.digits)") println("\(n.pi)")
當我們使用 playground 運行上面的程序,得到以下結(jié)果
67 3.1415
考慮在上面的代碼,如下面的一行:
let pi = 3.1415
這里,可變圓周率被初始化為存儲屬性值使用所述實例 pi = 3.1415. 所以,每當實例被稱為將持有單獨的值是:3.1415。
另一種方法,已存儲的屬性可能常量結(jié)構(gòu)。這樣結(jié)構(gòu)的整個實例將被認為是“常量屬性的存儲”。
structNumber{var digits:Intlet numbers =3.1415}var n =Number(digits:12345) n.digits =67 println("\(n.digits)") println("\(n.numbers)") n.numbers =8.7
當我們使用 playground 運行上面的程序,得到以下結(jié)果
error: cannot assign to 'numbers' in 'n' n.numbers = 8.7
重新初始化'數(shù)字'為8.7,它將返回指示“數(shù)字''被聲明為常數(shù)的錯誤消息。
Swift 提供了所謂的“懶存儲屬性',當變量被首次初始化它不會計算初始值. “lazy” 修飾符的變量聲明之前,把它作為一個懶存儲屬性。
延遲屬性被使用:
要延遲對象的創(chuàng)建。
當屬性是依賴于一個類的其他部分,即:尚未知道
class sample { lazy varno= number()// `var` declaration is required.}class number {var name ="Swift"}var firstsample = sample() println(firstsample.no.name)
當我們使用 playground 運行上面的程序,我們得到以下結(jié)果
Swift
在Objective C 中,存儲屬性還必須有實例變量用于備份目的,存放在存儲的屬性聲明的值。
Swift 集成了這些概念成一個“存儲的屬性”聲明。而不必有一個相應的實例變量和備份值'存儲屬性“,包含通過變量名一個位置定義的有關(guān)變量屬性所有信息集成,數(shù)據(jù)類型和存儲器管理功能。
而不是存儲計算的屬性值提供了一個getter和一個可選的 setter 間接來檢索和設(shè)置其他屬性和值。
class sample {var no1 =0.0, no2 =0.0var length =300.0, breadth =150.0var middle:(Double,Double){get{return(length /2, breadth /2)}set(axis){ no1 = axis.0-(length /2) no2 = axis.1-(breadth /2)}}}var result = sample() println(result.middle) result.middle =(0.0,10.0) println(result.no1) println(result.no2)
當我們使用 playground 運行上面的程序,我們得到以下結(jié)果
(150.0, 75.0) -150.0 -65.0
當計算的屬性留下了新的值為未定義默認值將針對特定的變量來設(shè)置。
在計算屬性只讀屬性被定義為 getter,但不是 setter。它總是用來返回一個值。變量通過使用 '.' 語法訪問,但不能被設(shè)置為其他值。
class film {var head =""var duration =0.0var metaInfo:[String:String]{return["head":self.head,"duration":"\(self.duration)"]}}var movie = film() movie.head ="Swift Properties" movie.duration =3.09 println(movie.metaInfo["head"]!) println(movie.metaInfo["duration"]!)
當我們使用 playground 運行上面的程序,我們得到以下結(jié)果
Swift Properties 3.09
在Swift 中使用屬性觀察者來觀察和設(shè)置屬性值響應。 當每一次屬性值設(shè)置屬性觀察者都被調(diào)用。 除了懶存儲屬性,我們可以通過添加屬性觀察者“繼承”屬性“覆蓋”方法。
在存放值之前 - willset
存儲新的值之后 - didset
當一個屬性被設(shè)置在初始化 willset 和 didset 觀察者不能調(diào)用。
classSamplepgm{var counter:Int=0{ willSet(newTotal){ println("Total Counter is: \(newTotal)")} didSet{if counter > oldValue { println("Newly Added Counter \(counter - oldValue)")}}}}letNewCounter=Samplepgm()NewCounter.counter =100NewCounter.counter =800
當我們使用 playground 運行上面的程序,我們得到以下結(jié)果
Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700
對于計算和觀察屬性局部和全局變量的聲明。
局部變量 | 全局變量 |
那些在函數(shù),方法或封閉環(huán)境中定義的變量 | 被外界函數(shù),方法,關(guān)閉或類型的上下文定義的變量 |
用于存儲和檢索值 | 用于存儲和檢索值 |
存儲屬性是用來獲取和設(shè)置值 | 存儲屬性是用來獲取和設(shè)置值 |
也可用于計算屬性 | 也可用于計算屬性 |
屬性定義類型定義部分有大括號{},并且變量的范圍也被前面所定義。要定義值類型使用 “static” 關(guān)鍵字以及類的類型使用 “class” 關(guān)鍵字。
structStructname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}enumEnumname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}classClassname{classvar computedTypeProperty:Int{// return an Int value here}}
類似于實例屬性類型屬性查詢和設(shè)置,只是使用 “.” 語法,而不用指向該實例的類型。
structStudMarks{staticlet markCount =97staticvar totalCount =0var上一篇:Swift函數(shù)參數(shù)與返回值下一篇:Swift 繼承