swiftプロパティ

7312 ワード

プロパティは、値とクラス、構造、列挙を関連付けます.属性は、計算属性と記憶属性に分けられます.属性を格納インスタンスの一部として定数または変数を格納し、属性を計算して値を計算します.ストレージ属性はクラスと構造体に使用され、計算属性はクラス、構造体、列挙に使用されます.
1:ストレージ属性
ストレージ属性は、クラスまたは構造体のインスタンスに格納される定数または変数です.
struct Range{
    var length:Int
    let height:Int
}
var testRang = Range(length:1, height:2)
testRang.length = 3

2:定数とストレージ属性
構造体のインスタンスを定数として定義した場合、インスタンスのプロパティは変更できません.
struct Range{
    var length:Int
    let height:Int
}
let testRang = Range(length:1, height:2)
//testRang.length = 3 error

これは、構造体(struct)が値タイプであり、インスタンスが定数として定義されると、構造体のすべての属性が定数タイプであるためである.
ただしclassクラスタイプの場合、定数として定義した後も、インスタンスの変数タイプは変更できます.クラスは参照タイプです.
3:遅延ストレージ属性.@Lazyは変数(変数varのみ)が遅延ストレージ属性として宣言されていることを示し、インスタンスの作成時に変数は作成されず、その変数を参照した場合にのみ作成されます.
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:属性とインスタンス変数
swift言語は変数を使用して記憶されず、属性アクセスを統一的に使用しています.
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読取り専用計算属性.setではなくgetのみで読み取り専用の計算プロパティを返すことができます.
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"