屬性將值和類,結構,枚舉相關聯。屬性分爲計算屬性和存儲屬性。存儲屬性存儲常量或變量做爲實例的一部分 ,計算屬性計算一個值。存儲屬性用於類和結構體,計算屬性用於類,結構體和枚舉。swift
1:存儲屬性spa
存儲屬性是存儲類或結構體的實例裏的一個常量或變量。code
struct Range{ var length:Int let height:Int } var testRang = Range(length:1, height:2) testRang.length = 3
2:常量和存儲屬性blog
若是將結構體的實例定義爲一個常量,則不能修改實例的任何屬性。繼承
struct Range{ var length:Int let height:Int } let testRang = Range(length:1, height:2) //testRang.length = 3 error
其緣由在於結構體(struct)是值類型,其實例被定義成常量後它結構體的全部屬性都是常量類型。get
但若是是class類類型,定義成常量後,實例的變量類型依然能夠被修改。類是引用類型。it
3:延遲存儲屬性。@lazy表示一個變量(只能是變量var)聲明爲延遲存儲屬性,這樣在實例建立時候變量不會建立,只有引用到該變量時候纔會建立io
class BigConstructor{ var strMsg = "big msg" } class CLazyVar{ @lazy var lazyVar = BigConstructor() var strName = "tset" } import Foundation var obj = CLazyVar(); obj.strName = "sx"//lazyVar還沒被建立 println("\(obj.strName) \(obj.lazyVar)")//這時候才建立
4:屬性和實例變量class
swift語言沒有使用變量來作存儲,統一使用屬性訪問。test
5: 計算屬性。計算屬性提供一個get/set來 獲取/改變 其餘屬性的值
class CValue{ var strName:String = "xx" var value:String{ get{ return strName } set(newStrName){ strName += newStrName } } } import Foundation var obj = CValue() obj.value = " oid" println("\(obj.strName)")
5.1 便捷set屬性,能夠使用默認的名字newValue寫set屬性而不用帶括號
class CValue{ var strName:String = "xx" var value:String{ get{ return strName } set{ strName += newValue } } }
5.2只讀計算屬性。能夠只經過get而不用set返回一個只讀計算屬性。
class CValue{ var strName:String = "xx" var value:String{ get{ return strName } } } import Foundation var obj = CValue() println("\(obj.strName)")
6:屬性監視器。
能夠爲除了延遲存儲屬性以外的其餘存儲屬性添加屬性監視器,也能夠經過重載屬性的方式 ,爲繼承的屬性(包括存儲屬性和計算屬性)添加屬性監視器 。計算屬性由於有set實際上就是它的屬性監視器了。使用willSet/didSet。
class CMonitor{ var strName:String = "" { willSet(newStrName){ println("willSet : \(newStrName)") } didSet(newStrName){ println("didSet:\(strName)") } } } import Foundation var monitor = CMonitor() monitor.strName = "sc"