Swift-05-ストレージ属性と計算属性

6531 ワード

  • プロパティは、値を特定のクラス、構造体、または列挙に関連付けます.ストレージ属性は、クラスおよび構造体に使用される定数または変数をインスタンスの一部として格納します.計算プロパティは、クラス、構造体、列挙で使用できる値を計算するために使用されます.
  • は、属性および計算属性を通常、特定のタイプのインスタンスに関連付けて格納する.ただし、属性はタイプ自体に直接作用することもでき、このような属性はタイプ属性となる.
  • Swiftは属性観測器を定義して属性値の変化を監視することができ、属性観測期間は自分が定義した記憶属性に追加することができ、親が継承した属性に
  • を追加することができる.

    1.記憶属性

  • 記憶属性は、特定のクラス、構造体に記憶される定数または変数である.
  • は、記憶属性を定義するときにデフォルト値を指定することができる.
  • は、構築中に記憶属性の値を設定または変更することができる.
  • //  ,FixedLengthRange 
    struct FixedLengthRange {
        var firstValue: Int
        let lenght: Int
    }
    
    var rangeOfThreeItens = FixedLengthRange(firstValue: 0, lenght: 3)
    
    // rangeOfThreeItens  firstValue lenght 
    //  lenght 
    
    rangeOfThreeItens.firstValue = 7;
    
    // rangeOfThreeItens  7 8 9 
    

    1.1定数構造体の記憶属性

  • 構造体のインスタンスを作成し、定数を割り当てると、インスタンスのプロパティは変更できません.
  • 構造体は値タイプであり、値タイプのインスタンスが定数として宣言されると、そのすべての属性が定数になります.次の修正を試みると、
  • とエラーが表示されます.
    let rangeOfThreeItens = FixedLengthRange(firstValue: 0, lenght: 3)
    rangeOfThreeItens.firstValue = 8
    

    1.2遅延ストレージ属性

  • 遅延記憶属性とは、最初に呼び出されたときにその初期値が計算される属性であり、通常の怠け者ロードである.
  • Swiftは属性の前にlazyキーワードを付けて遅延記憶属性をマークし、遅延記憶属性は変数(varキーワード)でなければならない.
  • プロパティが他の外部要因の影響(構造プロセス、初期値が複雑で、大量の計算など)に依存する場合、遅延プロパティを使用するのに適しています.
  • 
    // DataImporter , 
    class DataImporter {
        
        var fileName = "data.text"
        /**   **/
    }
    // DataManager 
    
    class DataManager {
        
        lazy var importer = DataImporter()
        var data = [String]()
        /**   **/
    
    }
    
    let manager = DataManager()
    
    manager.data.append("someData")
    manager.data.append("someMore")
    

    DataManagerクラスでファイルをインポートする手順を簡単に説明します.DataManagerは、データのインポートを管理し、DataImporterの機能に依存します.データのインポートに時間がかかりすぎ、データをインポートせずにデータの管理が完了する場合があります.DataImporterはすぐに作成する必要はありません.使用するときだけ作成します.
    print(manager.importer.fileName)
    

    上記のコードを実行する場合にのみ、DataImporterインスタンスが作成されます.

    1.3属性とインスタンス変数の格納

  • OCでは、クラスインスタンスの値と参照を格納する2つの方法が提供されています.XXXXXまたはself.XXXXX.
  • SwiftはOCの方法を統一し、属性に対応するインスタンス変数(_XXXXX)
  • がない
  • プロパティのすべての情報--名前、タイプ、メモリ管理プロパティ.すべてがユニークな場所(タイプ定義)
  • です.

    2.計算属性

  • 列挙、クラス、構造体は、記憶属性に加えて、計算属性を定義することもできる.
  • 計算プロパティは、値を直接格納するのではなく、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 * 0.5)
                let centerY = origin.y + (size.height * 0.5)
                return Point(x: centerX, y: centerY)
            }
            set(newCenter){
                origin.x = newCenter.x - (size.width * 0.5)
                origin.y = newCenter.y - (size.height * 0.5)
            }
        }
    }
    //  
    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: 20.0, y: 20.0)
    
    

    2.1便利setter声明

  • 計算属性のsetterが新しい値を表すパラメータ名を定義していない場合は、
  • を書き換えることができるデフォルト値newValueを用いることができる.
    
    struct Rect {
        var origin = Point()
        var size = Size()
        var center: Point{
            get{
                let centerX = origin.x + (size.width * 0.5)
                let centerY = origin.y + (size.height * 0.5)
                return Point(x: centerX, y: centerY)
            }
            set{
                origin.x = newValue.x - (size.width * 0.5)
                origin.y = newValue.y - (size.height * 0.5)
            }
        }
    }
    

    2.2読取り専用計算属性

  • getterのみsetterのない計算属性
  • 読取り専用計算プロパティは、ポイント構文でアクセスできる値を常に返しますが、
  • は設定できません.
  • 読取り専用計算プロパティgetとカッコ
  • を省略できます.
    //   ,volume 
    struct Cuboid{
        var width = 0.0, height = 0.0, depth = 0.0
        var volume: Double{
            return width * height * depth
        }
    }
    
    let newCuboid = Cuboid(width: 3.0, height: 4.0, depth: 5.0)
    

    3.属性オブザーバ

  • プロパティオブザーバは、プロパティ値の変化を監視し、応答し、プロパティが値を設定されるたびに呼び出されます.
  • 遅延属性属性は属性オブザーバ
  • を設定できません.
  • プロパティを書き換えることで、継承されたプロパティにオブジェクトを追加できます.
  • willSet:新しい値が設定される前に
  • が呼び出されます.
  • didSet:新しい値が設定された後に
  • が呼び出される.
  • 親の属性が子のコンストラクタに付与されると、オブザーバも
  • をトリガーする.
    
    // StepCounter 
    class StepCounter{
        var totalStep: Int = 0{
            willSet(newTotalSteps){
                print(" \(newTotalSteps) ")
            }
            didSet{
                if totalStep > oldValue{
                    print(" \(totalStep - oldValue) ")
                }
            }
        }
    }
    
    let stepCounter = StepCounter()
    stepCounter.totalStep = 200;
    //  200, 200 
    stepCounter.totalStep = 500;
    //  500, 300 
    

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


    グローバル変数は、関数、メソッド、閉パッケージ、または他のタイプ以外で定義された変数です.ローカル変数は、関数、メソッド、または閉パッケージ内で定義されます.
  • 計算属性および属性オブザーバによって記述されるモードは、グローバル変数およびローカル変数にも使用され得る.
  • デフォルトのグローバル変数とローカル変数は、ストレージ属性と同様にストレージ領域を提供し、
  • の読み取りと書き込みを可能にするストレージ型変数です.
  • グローバル変数およびローカル変数は、計算属性を定義し、属性オブザーバを追加することができる.
  • 注意!!
  • グローバルの定数または変数はいずれも遅延計算であり、遅延記憶属性とは異なり、グローバルの定数または変数はlazyをマークする必要がない.
  • ローカル範囲の定数または変数は計算を遅らせることはありません.

  • 5.タイプ属性


    インスタンスのプロパティは特定のインスタンスに属し、インスタンス間のプロパティは互いに独立しているか、クラスがどれだけのインスタンスがあるかにかかわらず、タイプ自体にプロパティを設定することもできます.これらのプロパティは唯一です.これがタイププロパティです.
  • タイプのプロパティです.たとえば、すべてのインスタンスに定数(C言語のような静的定数)があるか、変数(C言語のような動的変数)があるなどです.
  • 値タイプの記憶タイプ属性は変数または定数であってもよく、計算タイプ属性は計算属性と同様に定数属性としてしか定義できない.
  • 注意!!
  • は、タイプ自体が初期化中にコンストラクタを使用してタイプ属性に値を割り当てることができないため、ストレージタイプ属性にデフォルト値を指定する必要があります.
  • ストレージタイプ属性は遅延初期化であり、lazyを追加しないで、マルチスレッド同時アクセスも一度だけ初期化されます.

  • 5.1型属性構文


    Swiftでは、タイプ属性はタイプ定義の一部であり、タイプの最外層カッコ内に書かれており、役割ドメインはこのタイプがサポートする範囲内である.
  • キーワードstaticでタイプ属性
  • を定義する
  • クラスでは、親クラスの実装をキーワードclassで書き換えることをサポートします.
  • //  
    struct MyStruct{
    
        static var storedTypeProperty = "Some Value"
        
        static var comutedTypeProperty : Int{
            return 998
        }
    }
    
    enum MyEnum{
        static var storedTypeProperty = "Some Value"
        
        static var comutedTypeProperty : Int{
            return 998
        }
        
    }
    class MyClass {
        static var storedTypeProperty = "Some Value"
        
        static var comutedTypeProperty : Int{
            return 998
        }
        class var overridedableComutedTypeProperty : Int{
            return 100
        }
    }
    

    5.2タイプ属性の値の取得と設定


    インスタンスのプロパティと同様に、タイププロパティはポイント構文でアクセスできますが、インスタンスを通過する必要はありません.