SwiftProperty Swift3.0属性

4276 ワード

Swift Peoperty


Swiftには以下の属性があります
  • ストレージ属性(Stored properties):クラス、構造体、列挙インスタンスに関連するインスタンスの定数および変数を格納する
  • .
  • 計算属性(Computed properties):何らかの方法で計算された属性は、クラス、構造体のインスタンスのみに関連し、計算属性
  • は列挙されていない.
  • タイプ属性(type properties):タイプ自体に関連する
  • ストレージのプロパティ


    ストレージ・プロパティは、クラスまたは構造体のインスタンスの一部として、定数と変数を格納する最も簡単なプロパティです.
    ストレージ・プロパティについては、次の点があります.
  • ストレージ属性にデフォルト値を指定したり、定数属性であっても初期化方法で初期化したりすることができます.
  • 定数構造体インスタンスを作成すると、インスタンスの変数型ストレージ属性を変更することはできません.これは、構造体が値タイプであり、値タイプのインスタンスが定数としてマークされている場合、そのすべての属性も定数であるためです.クラスは参照タイプであるため、このバーはクラスタイプには適用されません.
  • プロパティを使用したときに再初期化したい場合は、怠惰なストレージプロパティ(lazy stored property、修飾子@lazy)を使用します.定数型プロパティは、常に初期化メソッドが完了する前に初期化する必要があるため、怠惰なストレージプロパティは常に変数として定義する必要があります.
  • Objective-Cとは異なり、Swiftのプロパティには対応するメンバー変数が必要なく、プロパティのバックアップストレージ(backing store)に直接アクセスできません.この方法では、異なるコンテキスト環境での値へのアクセスを混同することを回避し、属性を単一で明確な宣言に簡略化します.
  • struct FixedLengthRange {
      var firstValue: Int   // 
      let length: Int       // 
    }
    
    var item1 = FixedLengthRange(firstValue: 10, length: 10)
        
    let item2 = FixedLengthRange(firstValue: 10, length: 10)
    
    //item2.firstValue = 6       //  : 
    

    計算プロパティ


    計算プロパティは実際の値を格納するのではなく、getterとオプションの[setterを間接的に取得して他のプロパティを設定する]を提供します.
    計算プロパティについては、次の点があります.
  • 計算属性のsetterに新しい値の変数名が定義されていない場合、デフォルトはnewValue
  • です.
  • getterのみが提供され、setterが提供されない場合、計算属性は読取り専用属性
  • である.
  • 変数型読み取り専用属性のみを宣言できます.これらの値は固定された
  • ではありません.
  • 計算プロパティが読み取り専用の場合、get{}
  • を使用しなくてもよい
    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) {            //  , newValue
                origin.x = newCenter.x - size.width / 2
                origin.y = newCenter.y - size.height / 2
            }
        }
        
        var maxX:Float {        //  , get{}
            return Float(origin.x) + Float(size.width)
        }
    }
        
    var square = Rect(origin:Point(x: 0.0, y: 0.0), size:Size(width:100, height:100))
        
    let initialSquareCenter = square.center
    square.center = Point(x: 15.0, y:15.0)
    square.maxX
    

    タイプのプロパティ


    タイプ属性は、タイプのインスタンスではなくタイプに関連付けられます.-タイプに関連してオブジェクトに関連しないタイプ(class)のすべてのインスタンスについて、タイプ(class)プロパティにはコピーが1つしかありません.値タイプ(struct)では、ストレージタイププロパティと計算タイププロパティを定義できます.クラス(class)では、計算タイプ(setter)のプロパティしか定義できません.インスタンスのプロパティとは異なり、ストレージタイプ(getter)のプロパティにデフォルト値を設定する必要があります.これは、タイプがタイプ属性を初期化する方法がないためです.
    タイプ属性へのアクセスと設定はインスタンス属性と同様であり、タイプ属性はタイプによって取得され、設定され、タイプのインスタンスではありません.
    キーワード:class static
    struct AudioChannel {
        static let threaholdLevel = 10
        static var maxInputLevelForAllChannels = 0
        
        var currentLevel:Int = 0 {
            didSet{
                if currentLevel > AudioChannel.threaholdLevel {
                    currentLevel = AudioChannel.threaholdLevel
                }
                
                if currentLevel > AudioChannel.maxInputLevelForAllChannels {
                    AudioChannel.maxInputLevelForAllChannels = currentLevel
                }
            }
        }
    }
        
    var leftChannel = AudioChannel()
    var rightChannel = AudioChannel()
        
    leftChannel.currentLevel = 7
        
    println(leftChannel.currentLevel)       // 7
    println(AudioChannel.maxInputLevelForAllChannels)   // 7
        
    rightChannel.currentLevel = 11
    println(rightChannel.currentLevel)      // 10
    

    属性オブザーバ


    プロパティオブザーバは、プロパティ値の変化をリスニングおよび応答するために使用されます.アトリビュート値を設定するたびに、新しい値と古い値が同じであっても、アトリビュートオブザーバメソッドが呼び出されます.怠惰なストレージ属性を除いて、任意のストレージ属性のプロパティオブザーバを定義できます.継承されたプロパティにオブジェクトをサブクラスに追加することもできます.
    計算プロパティについては、計算プロパティのsetterでこの値の変化を直接観察し、応答できるため、プロパティオブザーバーを定義する必要はありません.
    観察者を定義するには、以下の観察方法を設定します.
  • willSet:属性値が格納される前に設定します.新しいプロパティ値が定数パラメータとして入力されます.このパラメータ名のデフォルトはnewValueで、パラメータ名
  • を自分で定義できます.
  • は、新しい属性値が格納された直後に呼び出される.willSetと同様に、属性の古い値が入力されます.デフォルトのパラメータ名はoldValue
  • です.
    willSetとdidSetは、プロパティが最初に設定されたときにのみ呼び出され、初期化時にこれらのリスニングメソッドは呼び出されません.
    転載する