OneDayOneSwift[10] - Properties

4463 ワード

プロパティは、値を特定のクラス、構造、または列挙に関連付けます.属性は、インスタンスの一部として定数または変数を格納し、属性計算(格納ではない)の値を計算します.計算プロパティは、クラス、構造体、および列挙に使用できます.記憶プロパティは、クラスおよび構造体にのみ使用できます.

定数構造体のストレージプロパティ


構造体のインスタンスを作成して定数に値を割り当てると、変数ストレージ属性が定義されている場合でも、インスタンスの属性は変更できません.
この挙動は構造体(struct)が値タイプに属するためである.値タイプのインスタンスが定数として宣言されると、そのすべてのプロパティが定数になります.
参照タイプに属するクラス(class)は異なります.参照タイプのインスタンスを定数に割り当てると、インスタンスの変数プロパティを変更できます.

遅延ストレージ属性


遅延ストレージ属性とは、最初に呼び出されたときにその初期値が計算される属性です.プロパティ宣言の前にlazyを使用して、遅延ストレージプロパティを表示します.
ps:インスタンス構築が完了してから、属性の初期値が得られる可能性があるため、遅延ストレージ属性を変数として宣言する必要があります(varキーワードを使用します).定数属性は、構築プロセスが完了する前に初期値が必要であるため、遅延属性として宣言できません.
遅延プロパティは、インスタンスの構築プロセスが終了してから特定の値の外部要因がわかるようにプロパティの値に依存する場合や、プロパティの初期値を取得するのに複雑または大量の計算が必要な場合にのみ計算できます.
ps:lazyとマークされた属性が初期化されていない場合、同時に複数のスレッドにアクセスされる場合、その属性が一度だけ初期化されることは保証されません.

計算プロパティ


クラス、構造体、列挙は、ストレージ属性に加えて計算属性を定義できます.計算プロパティは、値を直接格納するのではなく、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 {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
    size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
//   "square.origin is now at (10.0, 10.0)”

getterにsetterがない計算属性だけが読み取り専用計算属性です.読み取り専用計算プロパティは、ポイント演算子でアクセスできる値を常に返しますが、新しい値を設定することはできません.
ps:varキーワードを使用して、値が固定されていないため、読み取り専用計算属性を含む計算属性を定義する必要があります.letキーワードは定数属性を宣言するためにのみ使用され、初期化後に変更できない値を示します.
読み取り専用の計算属性の宣言はgetキーワードとカッコを削除することができる.

属性オブザーバ


プロパティ・オブザーバは、プロパティ値の変化を監視し、応答します.プロパティが値を設定されるたびにプロパティ・オブザーバが呼び出され、新しい値が現在の値と同じ場合でも例外ではありません.
遅延ストレージ属性以外のストレージ属性に属性オブザーバを追加するか、継承した属性(ストレージ属性と計算属性を含む)を書き換えることで属性オブザーバを追加できます.
ps:書き換えられていない計算プロパティにプロパティオブザーバを追加する必要はありません.setterによって値の変化を直接監視し、応答することができます.
アトリビュートに次の1つまたはすべてのオブジェクトを追加できます.
  • willSet新しい値が設定前に
  • が呼び出される.
  • didSetは、新しい値が設定された直後に
  • を呼び出す.
    ps:プロパティのdidSetオブジェクトに値を割り当てると、前に設定した値が置き換えられます.

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


    属性と属性オブジェクトを計算する機能は、グローバル変数とローカル変数にも使用できます.グローバル変数は、関数、メソッド、閉パッケージ、または任意のタイプ以外で定義された変数です.ローカル変数は、関数、メソッド、または閉パッケージの内部で定義された変数です.
    計算型変数は、グローバルまたはローカルの範囲で定義し、格納型変数のオブザーバを定義できます.計算型変数は、計算プロパティと同様に、値を格納するのではなく計算結果を返し、宣言フォーマットも完全に同じです.
    ps:グローバルの定数または変数はいずれも遅延計算であり、遅延記憶属性と同様であり、異なる点は、グローバルの定数または変数はlazy修飾子をマークする必要がないことである.ローカル範囲の定数または変数は、計算を遅延しません.

    タイプのプロパティ


    ps:インスタンスのストレージ属性とは異なり、ストレージタイプ属性にデフォルト値を指定する必要があります.タイプ自体にコンストラクタがないため、初期化中にコンストラクタを使用してタイプ属性に値を割り当てることはできません.ストレージ・タイプ・プロパティは、最初にアクセスしたときにのみ初期化される遅延初期化です.複数のスレッドに同時にアクセスされても、システムは、lazy修飾子を使用する必要がなく、一度だけ初期化されることを保証します.
    キーワード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 var computedTypeProperty: Int {
            return 27
        }
        class var overrideableComputedTypeProperty: Int {
            return 107
        }
    }
    

    インスタンス属性と同様に、タイプ属性もポイント演算子でアクセスします.ただし、タイプ属性は、インスタンスではなくタイプ自体でアクセスする.
    print(SomeStructure.storedTypeProperty)
    //   "Some value."
    SomeStructure.storedTypeProperty = "Another value."
    print(SomeStructure.storedTypeProperty)
    //   "Another value.”
    print(SomeEnumeration.computedTypeProperty)
    //   "6"
    print(SomeClass.computedTypeProperty)
    //   "27"
    

    要点まとめ


    グローバル変数とローカル変数は、計算プロパティとプロパティオブザーバで記述された機能を使用することもできます.The capabilities of computing and observing properties are also available to global variables and local variables.