プロパティ(Properties)

5564 ワード

プロパティは、値を特定のクラス、構造、または列挙に関連付けます.
  • ストレージ属性:インスタンスの一部として定数または変数を格納します.
  • 計算プロパティは、クラス、構造体、および列挙
  • に使用することができる.
  • 計算プロパティ:1つの値を計算します(格納されていません).
  • ストレージ属性は**クラス**および構造体にのみ使用できます.*


  • 属性はインスタンス属性とタイプ属性に分けられます

    1.記憶属性


    ≪記憶プロパティ|Storage Properties|emdw≫:特定のクラスまたは構造体インスタンスに格納される定数または変数です.
  • 変数格納属性(キーワードvarで定義)
  • 定数記憶属性(キーワードletで定義)
  • **ストレージ属性のデフォルト**
  • 記憶属性は、定義時にデフォルト値を付与することができる.
  • は、構築中に記憶属性の値を設定および変更することができる.(定数の値はコンストラクション関数でのみ変更可能)
  • 定数構造体のストレージ属性は、構造体のインスタンスを作成し、定数に値を割り当てると、変数として宣言された属性があっても、インスタンスの属性を変更することはできません.(定数構造体の変数属性は変更できません.これは構造体の値タイプによって決まります)
    **遅延ストレージ属性**遅延ストレージ属性とは、最初に呼び出されたときにその初期値が計算される属性です.プロパティ宣言の前にlazyを使用して、遅延ストレージプロパティを表示します.
  • 遅延ストレージ属性はvarで
  • を宣言する必要があります.
  • lazyとマークされた属性は、初期化されていない場合に同時に複数のスレッドにアクセスされ、その属性が一度だけ初期化されることは保証されない.(ロック)
  • [インスタンスプロパティ](Instance Properties)シーンを使用する
  • プロパティ値インスタンスの構築プロセスは
  • に依存しない.
  • 属性の値は、大量の計算を必要とする(時間がかかる)(ローカルファイルデータをロードすれば遅延属性を使用できる)
  • を得ることができる.

    2.計算属性

  • **計算プロパティは、値を直接格納するのではなく、getterとオプションのsetterを提供し、他のプロパティまたは変数の値を間接的に取得および設定します.
  • 計算プロパティはvarでのみ宣言できます.(属性値を計算する不確実性により決定される)
  • 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()
    
        //  ,   origin   size  。 。
        var center: Point {
    
            // getter
            get {
                let centerX = origin.x + (size.width / 2)
                let centerY = origin.y + (size.height / 2)
                return Point(x: centerX, y: centerY)
            }
    
            // setter ( )
            /**
              set    newValue  。
               set  , 。
    
                  set  ,  newValue   set  。
              set {
                  origin.x = newValue.x - (size.width / 2)
                  origin.y = newValue.y - (size.height / 2)
              }
            */
            set(newCenter) {
                origin.x = newCenter.x - (size.width / 2)
                origin.y = newCenter.y - (size.height / 2)
            }
        }
    }
    

    読み取り専用計算プロパティ:getterにsetterがない計算プロパティのみが読み取り専用計算プロパティです.(読み取り専用計算プロパティは常に一定の値を返し、新しい値を割り当てることはできません)
    struct Cuboid {
        var width = 0.0, height = 0.0, depth = 0.0
        
        //  ,  get  
        var volume: Double {
            return width * height * depth
        }
    }
    

    3.プロパティ・オブザーバ(ストレージ・プロパティと計算プロパティの両方にプロパティ・オブザーバを追加できます)


    アトリビュートオブザーバは、アトリビュート値の変化を監視し、応答します.アトリビュート値が設定されるたびに、新しい値と現在の値が同じであっても、アトリビュートオブザーバが呼び出されます.
  • 遅延ストレージ属性には属性オブザーバがありません.(重点)
  • は、属性を書き換えることによって、継承された属性(記憶属性および計算属性を含む)に属性オブザーバを追加することができる.
  • は、すべてのストレージ属性に属性オブザーバを追加することができる.
  • は、そのsetterによって直接値の変化を監視し、応答できるため、非書き換え(非継承)の**計算属性**に属性オブザーバを追加する必要はありません.

  • 理論的には属性オブジェクトはすべての属性に追加できます.(ストレージが計算かどうかを区別する必要はありません.主に使用するシーンを区別します)
    次の1つ以上のアトリビュートオブザーバをアトリビュートに追加できます.
  • willSet:新しい値が設定される前に呼び出されます.
  • willSetオブザーバは、新しい属性値を定数パラメータとして入力します.willSetの実装コードでは、このパラメータの名前を指定できます.デフォルトのパラメータnewValueを使用することは指定されません.

  • didSet:新しい値が設定された後に呼び出されます.
  • didSetオブザーバは、古い値をパラメータとして入力します.didSetの実装コードでは、このパラメータの名前を指定できます.デフォルトのパラメータoldValue
  • を使用することはできません.
    class StepCounter {
    
        //  
        var totalSteps: Int = 0 {
    
            // willSet   ,   newTotalSteps。
            /*
            //  
            willSet {
                print("About to set totalSteps to \(newValue)")
            }
            */
            willSet(newTotalSteps) {
                print("About to set totalSteps to \(newTotalSteps)")
            }
    
    
            /*
            //  , 。
            didSet ( tempOldValue ) {
                // totalSteps  。
                if totalSteps > tempOldValue  {
                    print("Added \(totalSteps - tempOldValue) steps")
                }
            }
            */
            //  
            didSet {
                if totalSteps > oldValue  {
                    print("Added \(totalSteps - oldValue) steps")
                }
            }
        }
    }
    

    ストレージ属性の使用上の注意:
  • 親の属性が子に割り当てられると、親の属性オブザーバが呼び出され、子の属性オブザーバが呼び出されます.
  • 親初期化メソッドが呼び出される前に、サブクラスが属性に値を付与すると、オブザーバは呼び出されません.

  • 属性はin-out方式で入力され、属性オブジェクトも呼び出されます.
  •  * in-out  ,  , 。
    

    4.グローバル変数とローカル変数


    ≪グローバル変数|Global Variables|oem_src≫:関数、メソッド、クローズド・パッケージ、または任意のタイプ以外で定義される変数です.ローカル変数:関数、メソッド、または閉パッケージの内部で定義された変数です.
    グローバル変数またはローカル変数は、ストレージ属性と同様にストレージ型変数に属し、特定のタイプの値にストレージ領域を提供し、読み取りと書き込みを許可します.
    計算型変数は、グローバルまたはローカルの範囲で定義し、格納型変数のオブザーバを定義できます.計算型変数は、計算プロパティと同様に、値を格納するのではなく計算結果を返し、宣言フォーマットも完全に同じです.
    注意:グローバルの定数または変数は、遅延ストレージ属性と同様に遅延計算され、 , lazy 。のローカル範囲の定数または変数は遅延計算されません.

    5.タイプ属性


    ≪インスタンス・プロパティ|Instance Properties|emdw≫:特定のタイプのインスタンスのプロパティをインスタンス・プロパティと呼びます.インスタンス間のプロパティは互いに独立しています.≪タイプ・プロパティ|Type Properties|ldap≫:特定のタイプのプロパティをインスタンス・プロパティと呼びます.タイプ間のプロパティは共有されます.唯一です.(タイプ属性:特何第一眼も分からなかった.実は特何がクラスに書かれた静的変数と静的定数)
    staticを使用して、タイププロパティ(静的変数と静的定数)を定義します.
    計算型タイププロパティを定義し、classを使用して親の書き換えをサポートします.
    struct SomeStructure {
        static var storedTypeProperty = "Some value."
        static var computedTypeProperty: Int {
            return 1
        }
    }
    enum SomeEnumeration {
        static var storedTypeProperty = "Some value."
        static var computedTypeProperty: Int {
            return 6
        }
    }
    class SomeClass {
        static var storedTypeProperty = "Some value."
        
        //   static   
       static var computedTypeProperty: Int {
            return 27
        }
    
        //   class  。
        class var overrideableComputedTypeProperty: Int {
            return 107
        }
    }