OCの@propertyとSwiftのストレージ属性/計算属性クラス比

1709 ワード

Swiftの計算属性/記憶属性とOCの@property


 Swiftには記憶属性、計算属性の概念が導入されており、記憶属性はいくつかの値や参照を記憶するために使用され、計算属性はget/setメソッドを提供して他の属性や論理操作を処理するが、get/setメソッドでは計算属性自体を変更することはできない.そうしないとデッドサイクルになる.  OCには属性と計算属性を格納する概念はないが,@propertyキーワードは実際には記憶属性+計算属性の自動作成を間接的に完了している.
@property (nonatomic, copy) NSString *aStr;

  上記の属性を例にとると、 OCの@propertyキーワードが自動的に2つの属性を生成してくれます(ここではクラス比Swiftの説ですが、実際にOCの説では変数_aStr、get/setメソッドです).aStr:属性を格納->NSStringを格納するために使用され、1つはaStr:属性の計算->getメソッド戻り_aStr、setメソッドペア_aStrはいくつかの他の操作を行う. Swiftには@propertyのキーワードはありません.1つの属性を次のように書きたい場合は、get/setを実現する方法は間違っています.
//  
var name: String? {
        get {
            return name
        }
        set {
            name = newValue
        }
    }

  上記の形式に書くと、コンパイラは、実行中にnameが自分のget/setメソッドでnameを操作しているため、本質的にはnameを呼び出すget/setメソッドであるため、最終的にはデッドサイクルに陥っているに違いないと警告します. , , .では、OCと比べて理想的なget/setメソッドを実現したいのですが、Swiftのこの計算属性nameに欠けているのは何でしょうか.ストレージ属性を追加することですname:
var _name: String?
var name: String? {
        get {
            return _name
        }
        set {
            _name = newValue
        }
    }

  このように,以上のSwiftコード実装の機能はOCにおける@property実装の機能と同様である.

@property、@synthesize、@dynamic


  xcode4.4以前、@propertyで属性を宣言した場合、実際には@synthesizeと組み合わせて使用されていました.@propertyはget/setメソッドを生成し、@synthesizeはストレージ属性を生成しました(現在、@propertyは@synthesizeが提供する機能をデフォルトで実現しています):
// @interface 
@property (nonatomic, copy) NSString *name;

// @implementation 
@synthesize name = _name;

  クラス比Swiftでの記憶属性、計算属性、@property @synthesize であればよく理解できる.