第十二章ツールバーの

13851 ワード

ソース
Official documents
 
属性は、計算属性、記憶属性、タイプ属性に分けられます
また、属性モニタを定義して、属性値の変化を監視することもできます.プロパティモニタは、自分が書いたストレージプロパティに追加したり、親から継承したプロパティに追加したりできます.
 

ストレージのプロパティ


簡単に言えば、1つのストレージ属性は、特定のクラスまたは構造体のインスタンスに格納される定数または変数です.
次の例では、作成後に値ドメイン幅を変更できない区間を記述するFixedLengthRangeという構造体を定義します.
struct FixedLengthRange { 
    var firstValue: Int 
    let length: Int 
} 
var range = FixedLengthRange(firstValue: 0, length: 3) 
//  0,1,2 
range.firstValue = 6 
//  6,7,8 , length , 。

 

定数とストレージのプロパティ

//  , , :
let range = FixedLengthRange(firstValue: 0, length: 4) 
//  0,1,2,3 
range.firstValue = 6 
//  firstValue ,  

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

遅延ストレージ属性


遅延ストレージ属性とは、最初に呼び出されたときにその初期値が計算される属性です.プロパティ宣言の前にlazyを使用して、遅延ストレージプロパティを表示します.
注意:インスタンス構築が完了するまで属性の値が得られない可能性があるため、遅延ストレージ属性を変数として宣言する必要があります(varキーワードを使用).
 
class DataImporter { 
    /* 
    DataImporter  。 
     。 
    */ 
    var fileName = "data.txt" 
    //   
} 
 
class DataManager { 
    lazy var importer = DataImporter() 
    var data = [String]() 
    //   
} 
 
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter   importer   

  
lazyを使用している場合にのみ、importerプロパティは最初にアクセスされたときに作成されます.たとえば、プロパティfile Nameにアクセスする場合:
println(manager.importer.fileName) 
// DataImporter   importer   
//   "data.txt” 

 

計算プロパティ


ストレージ属性に加えて、クラス、構造体、列挙は計算属性を定義し、計算属性は直接値を格納するのではなく、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) 
      } 
  } }


便利set宣言


計算属性のsetterに新しい値を表すパラメータ名が定義されていない場合は、デフォルト名newValueを使用します.以下は、便利なsetter宣言を使用したRect構造体コードです.
struct AlternativeRect { 
    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) 
      } 
    } 
} 

 

読み取り専用計算プロパティ


getterにsetterがない計算属性だけが読み取り専用計算属性です.
注意:varキーを使用して、値が固定されていないため、読み取り専用の計算プロパティを含む計算プロパティを定義する必要があります.letキーワードは定数属性を宣言するためにのみ使用され、初期化後に変更できない値を表します.
読み取り専用計算プロパティの宣言では、getキーとカッコを削除できます.
struct Cuboid { 
    var width = 0.0, height = 0.0, depth = 0.0 
    var volume: Double { 
        return width * height * depth 
    } 
} 
let four = Cuboid(width: 4.0, height: 5.0, depth: 2.0) 
println("\(four.volume)") 
//   "40.0" 

では、属性だけを書いていますか?
 

プロパティモニタ


アトリビュートオブザーバは、次の2つに分けられます.
  • willSet(属性値が変更される前にトリガーされます)-デフォルト名newValue
  • didSet(属性値が変更されるとトリガーされます)-デフォルトパラメータ名oldValue.

  • 注意:willSetおよびdidSetオブザーバは、プロパティの初期化中に呼び出されず、プロパティの値が初期化以外の場所に設定された場合にのみ呼び出されます.
    class StepCounter {
        var totalSteps: Int = 0 {
            willSet {
                println("About to set totalSteps to \(newValue)")
            }
            didSet {
                if totalSteps > oldValue  {
                    println("Added \(totalSteps - oldValue) steps")
                }
            }
        }
    }

     

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

  • グローバル変数は、関数、メソッド、クローズドパッケージ、または任意のタイプ以外に定義された変数
  • である.
  • ローカル変数は、関数、メソッド、または閉パッケージの内部で定義された変数
  • である.
    注意:
    グローバルの定数または変数は、遅延ストレージ属性と同様に遅延計算され、異なる点は、グローバルの定数または変数がlazy特性をマークする必要がないことである.ローカル範囲の定数または変数は計算を遅延しません

    タイプ属性(静的属性に相当)

  • 定義タイプ属性のフォーマットはstatic var属性名:タイプ{get/set{}
  • 参照タイプの場合、タイプ属性は計算属性を使用する必要があり、記憶属性ではなく、変数
  • でなければならない.
  • struct、enumは、タイプ属性がインスタンスの範疇に属さないため、任意のコンストラクタを使用して
  • を割り当てることができないため、タイプ属性にデフォルト値を設定する必要があります.
    タイプ属性構文
     
    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
        }
    }

    注:例の計算タイプ属性は読み取り専用ですが、読み取り可能で書き込み可能な計算タイプ属性を定義することもできます.
    タイプ属性の値を取得して設定し、クラス名で直接アクセスします.
    println(SomeClass.computedTypeProperty) 
    //   "42" 
     
    println(SomeStructure.storedTypeProperty) 
    //   "Some value." 
    SomeStructure.storedTypeProperty = "Another value." 
    println(SomeStructure.storedTypeProperty) 
    //   "Another value.” 

      
    構造体のタイププロパティ:
    struct AudioChannel {
        static let thresholdLevel = 10
        static var maxInputLevelForAllChannels = 0
        var currentLevel: Int = 0 {
            didSet {
                if currentLevel > AudioChannel.thresholdLevel {
                    //  
                    currentLevel = AudioChannel.thresholdLevel
                }
                if currentLevel > AudioChannel.maxInputLevelForAllChannels {
                    //  
                    AudioChannel.maxInputLevelForAllChannels = currentLevel
                }
                //  currentLevel 10
            }
        }
    }

     
    var leftChannel = AudioChannel()
    var rightChannel = AudioChannel()
    
    leftChannel.currentLevel = 7
    print(leftChannel.currentLevel)
    // prints "7"
    print(AudioChannel.maxInputLevelForAllChannels)
    // prints "7"
    
    rightChannel.currentLevel = 11
    print(rightChannel.currentLevel)
    // prints "10"
    print(AudioChannel.maxInputLevelForAllChannels)
    // prints "10"

     
    let  
    var  
    
      var/let  
      var
    
     
         : class
             
        
         : struct、enum

     
    2015-03-21
    19:44:13