swift 屬性

屬性將值和類,結構,枚舉相關聯。屬性分爲計算屬性和存儲屬性。存儲屬性存儲常量或變量做爲實例的一部分 ,計算屬性計算一個值。存儲屬性用於類和結構體,計算屬性用於類,結構體和枚舉。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"
相關文章
相關標籤/搜索