Swift属性

3335 ワード

ストレージ属性と計算属性

  • 記憶属性:直接記憶値、 OC
  • 計算属性は、クラス、構造体、および列挙に使用でき、記憶属性はクラスおよび構造体にのみ使用できます.属性を計算する設計の目的は、値を格納することではなく、他の属性を取得および間接的に設定することです.
  • 記憶属性は、定数記憶属性(letで定義)でも変数記憶属性(varで定義)でもよい.計算プロパティは変数格納プロパティ(varで定義)のみです.
  • クラス属性
  • クラスおよび構造体において、記憶属性はstaticキーワードでクラス属性
  • として定義することができる.
  • 構造体では、計算属性はstaticキーワードでクラス属性を定義します.クラスでは、計算プロパティはstatic/classキーワードでクラスプロパティを定義します(計算プロパティの本質はメソッドであり、クラス内のメソッドはstatic/classキーワードでクラスメソッドを定義できます)
  • .
    struct Person2 {
        var name: String
        var age : Int
        let card: String //  
    }
    var p2 = Person2(name: "HaRi", age: 24, card: "1234")
    p2.name = "helloName"
    p2.age = 25
    //  
    //p2.card = "333" Error!
    
  • プロパティの計算: getterと setterを1つ提供することによって、他のプロパティと値を間接的に取得し、設定します.
  • はgetterのみを提供し、setterのない属性を読み取り専用計算属性
  • と呼ぶ.
    struct Point {
        var x = 0.0, y = 0.0
    }
    struct Size {
        var width = 0.0, height = 0.0
    }
    struct Rect {
        var origin = Point()
        var size = Size()
        var center: Point {
            get {
                let centerX = origin.x + (size.width / 2)
                let centerY = origin.y + (size.height / 2)
                return Point(x: centerX, y: centerY)
            }
            set(newCenter) {
                origin.x = newCenter.x - (size.width / 2)
                origin.y = newCenter.y - (size.height / 2)
            }
        }
    }
    
    var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))
    square.center = Point(x: 15.0, y: 15.0)
    
  • 計算プロパティは、簡潔に書くことができます.つまり、簡潔に書くことを省略することができ、デフォルトではnewValue値が付きます.以下の
  • class Calcuator {
        var a:Int = 1
        var b:Int = 1
        var sum:Int{
            get{
                return a + b
            }
            set{    // ,newValue 
                b = newValue - a
            }
        }
    }
    
  • 読取り専用計算プロパティは、一般にgetキーワードとそのカッコを削除することによって
  • を簡潔に書くことができる.
    class Calcuator2 {
        var a:Int = 1
        var b:Int = 1
        var sum:Int {
            return a + b
        }
    }
    

    Swiftのlazy

  • Swiftで怠惰なロードを実現するにはlazyキーを使用し、varキーを使用して遅延ロードのプロパティを定義する必要があります.Lazyが修飾したプロパティは、最初のアクセス時にのみロードされ、いつまでもアクセスしない場合は作成されず、最適化メモリで使用できます.
  • 一般的にオブジェクトを構築した後、オブジェクト内のストレージ属性には初期値が必要であるが、例外としてlazyストレージ属性があり、その初期化は属性が最初に呼び出されるまで遅延する.
  • lazyストレージプロパティ書き方:lazy var name:String="zhangsan"
  • lazy計算属性書き方(閉パケットの値をlazy変数に割り当て、末尾に括弧が必要で、閉パケットの呼び出しが完了した):
  • lazy var stutentList : Array = {
        var arrrM:Array = []
    
        return arrrM as [AnyObject]
    }()
    
  • 例:Swift-怠惰ロードの実装
  • 属性オブザーバ

  • 属性オブザーバは、OCのKVOのように、属性がいつ変更されるかを傍受するために使用することができ、属性が変更されてこそ
  • が呼び出される.
  • 属性オブザーバは2種類あります:1.willSetは、新しい値を設定する前に2を呼び出す.didSet、新しい値を設定した後に
  • を呼び出す
  • はlazy属性と計算属性以外の変数記憶属性にのみ属性オブザーバを設定できるが、継承クラスでは親クラスの計算属性に属性オブザーバを提供できる(計算属性内部でも属性の変更を傍受できるため、計算属性に属性オブザーバを追加することは何の意味もない)
  • .
    class Line3{
        var start: Double = 0.0{
            willSet{
                print("willSet newValue = \(newValue)")
            }
            didSet{
                 print("didSet newValue = \(start) ,oldValue = \(oldValue)")
            }
        }
    
        var end: Double = 0.0
    }
    var l = Line3()
    l.start = 10.0
    

    以上の印刷出力
    willSet newValue = 10.0
    didSet oldValue = 0.0