Swift 屬性
Swift 語言提供了類,枚舉或結構相關聯值的屬性。屬性可以被進一步分為存儲屬性和計算屬性。
存儲性能和計算屬性的區彆
存儲屬性 | 計算屬性 |
存儲常量和變量值的實例 | 計算的值,而不是存儲的值 |
通過類和結構提供 | 通過類,枚舉和結構提供 |
這兩種存儲和計算屬性與實例類型相關聯。當屬性與它的類型值相關聯,那麼它定義為“類型屬性”。存儲和計算的屬性通常與一個特定類型的實例相關聯。然而,屬性也可以與類型本身相關聯。這樣的屬性是已知的類型的屬性。 屬性觀察者也被使用
-
觀察存儲的屬性值
-
觀察子類從父繼承而得的屬性
存儲屬性
Swift 介紹存儲的屬性概念用來存儲常量和變量的實例。常量存儲的屬性由 'let' 關鍵字定義和存儲變量的屬性由 “var” 關鍵字定義。
-
在定義存儲的屬性提供了“默認值”
-
在初始化期間用戶可以初始化和修改初始值
structNumber{var digits:Intlet pi =3.1415}var n =Number(digits:12345) n.digits =67 println("\(n.digits)") println("\(n.pi)")
當我們使用 playground 運行上麵的程序,得到以下結果
67 3.1415
考慮在上麵的代碼,如下麵的一行:
let pi = 3.1415
這裡,可變圓周率被初始化為存儲屬性值使用所述實例 pi = 3.1415. 所以,每當實例被稱為將持有單獨的值是:3.1415。
另一種方法,已存儲的屬性可能常量結構。這樣結構的整個實例將被認為是“常量屬性的存儲”。
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 運行上麵的程序,得到以下結果
error: cannot assign to 'numbers' in 'n' n.numbers = 8.7
重新初始化'數字'為8.7,它將返回指示“數字''被聲明為常數的錯誤消息。
懶存儲屬性
Swift 提供了所謂的“懶存儲屬性',當變量被首次初始化它不會計算初始值. “lazy” 修飾符的變量聲明之前,把它作為一個懶存儲屬性。
延遲屬性被使用:
-
要延遲對象的創建。
-
當屬性是依賴於一個類的其他部分,即:尚未知道
class sample { lazy varno= number()// `var` declaration is required.}class number {var name ="Swift"}var firstsample = sample() println(firstsample.no.name)
當我們使用 playground 運行上麵的程序,我們得到以下結果
Swift
實例變量
在Objective C 中,存儲屬性還必須有實例變量用於備份目的,存放在存儲的屬性聲明的值。
Swift 集成了這些概念成一個“存儲的屬性”聲明。而不必有一個相應的實例變量和備份值'存儲屬性“,包含通過變量名一個位置定義的有關變量屬性所有信息集成,數據類型和存儲器管理功能。
計算屬性
而不是存儲計算的屬性值提供了一個getter和一個可選的 setter 間接來檢索和設置其他屬性和值。
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 運行上麵的程序,我們得到以下結果
(150.0, 75.0) -150.0 -65.0
當計算的屬性留下了新的值為未定義默認值將針對特定的變量來設置。
計算屬性為隻讀屬性
在計算屬性隻讀屬性被定義為 getter,但不是 setter。它總是用來返回一個值。變量通過使用 '.' 語法訪問,但不能被設置為其他值。
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 運行上麵的程序,我們得到以下結果
Swift Properties 3.09
計算屬性屬性觀察者
在Swift 中使用屬性觀察者來觀察和設置屬性值響應。 當每一次屬性值設置屬性觀察者都被調用。 除了懶存儲屬性,我們可以通過添加屬性觀察者“繼承”屬性“覆蓋”方法。
-
在存放值之前 - willset
-
存儲新的值之後 - didset
-
當一個屬性被設置在初始化 willset 和 didset 觀察者不能調用。
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 運行上麵的程序,我們得到以下結果
Total Counter is: 100 Newly Added Counter 100 Total Counter is: 800 Newly Added Counter 700
局部和全局變量
對於計算和觀察屬性局部和全局變量的聲明。
局部變量 | 全局變量 |
那些在函數,方法或封閉環境中定義的變量 | 被外界函數,方法,關閉或類型的上下文定義的變量 |
用於存儲和檢索值 | 用於存儲和檢索值 |
存儲屬性是用來獲取和設置值 | 存儲屬性是用來獲取和設置值 |
也可用於計算屬性 | 也可用於計算屬性 |
類型屬性
屬性定義類型定義部分有大括號{},並且變量的範圍也被前麵所定義。要定義值類型使用 “static” 關鍵字以及類的類型使用 “class” 關鍵字。
語法
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}}
查詢和設置屬性
類似於實例屬性類型屬性查詢和設置,隻是使用 “.” 語法,而不用指向該實例的類型。
structStudMarks{staticlet markCount =97staticvar totalCount =0varInternalMarks:Int=0{ didSet {ifInternalMarks>StudMarks.markCount {InternalMarks=StudMarks.markCount }ifInternalMarks>StudMarks.totalCount {StudMarks.totalCount =InternalMarks}}}}var stud1Mark1 =StudMarks()var stud1Mark2 =StudMarks() stud1Mark1.InternalMarks=98 println(stud1Mark1.InternalMarks) stud1Mark2.InternalMarks=87 println(stud1Mark2.InternalMarks)
當我們使用 playground 運行上麵的程序,我們得到以下結果
97 87