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
であればよく理解できる.
@property (nonatomic, copy) NSString *aStr;
//
var name: String? {
get {
return name
}
set {
name = newValue
}
}
var _name: String?
var name: String? {
get {
return _name
}
set {
_name = newValue
}
}
xcode4.4以前、@propertyで属性を宣言した場合、実際には@synthesizeと組み合わせて使用されていました.@propertyはget/setメソッドを生成し、@synthesizeはストレージ属性を生成しました(現在、@propertyは@synthesizeが提供する機能をデフォルトで実現しています):
// @interface
@property (nonatomic, copy) NSString *name;
// @implementation
@synthesize name = _name;
クラス比Swiftでの記憶属性、計算属性、
@property
、@synthesize
であればよく理解できる.