与えられた答えはうまくいき、私の提案はそれを拡張したものであり、ボイラープレートコードを書きすぎないようにしています。
カテゴリプロパティのgetterメソッドとsetterメソッドを繰り返し作成することを避けるために、この回答ではマクロを紹介しています。さらに、これらのマクロは、int
やなどのプリミティブ型プロパティの使用を容易にしますBOOL
。
マクロを使用しない従来のアプローチ
従来、次のようなカテゴリプロパティを定義します。
@interface MyClass (Category)
@property (strong, nonatomic) NSString *text;
@end
次に、関連付けられたオブジェクトとgetセレクターをキーとして使用して、getterメソッドとsetterメソッドを実装する必要があります(元の回答を参照)。
#import <objc/runtime.h>
@implementation MyClass (Category)
- (NSString *)text{
return objc_getAssociatedObject(self, @selector(text));
}
- (void)setText:(NSString *)text{
objc_setAssociatedObject(self, @selector(text), text, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
私の提案するアプローチ
ここで、代わりにマクロを使用して記述します。
@implementation MyClass (Category)
CATEGORY_PROPERTY_GET_SET(NSString*, text, setText:)
@end
マクロは次のように定義されています。
#import <objc/runtime.h>
#define CATEGORY_PROPERTY_GET(type, property) - (type) property { return objc_getAssociatedObject(self, @selector(property)); }
#define CATEGORY_PROPERTY_SET(type, property, setter) - (void) setter (type) property { objc_setAssociatedObject(self, @selector(property), property, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
#define CATEGORY_PROPERTY_GET_SET(type, property, setter) CATEGORY_PROPERTY_GET(type, property) CATEGORY_PROPERTY_SET(type, property, setter)
#define CATEGORY_PROPERTY_GET_NSNUMBER_PRIMITIVE(type, property, valueSelector) - (type) property { return [objc_getAssociatedObject(self, @selector(property)) valueSelector]; }
#define CATEGORY_PROPERTY_SET_NSNUMBER_PRIMITIVE(type, property, setter, numberSelector) - (void) setter (type) property { objc_setAssociatedObject(self, @selector(property), [NSNumber numberSelector: property], OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
#define CATEGORY_PROPERTY_GET_UINT(property) CATEGORY_PROPERTY_GET_NSNUMBER_PRIMITIVE(unsigned int, property, unsignedIntValue)
#define CATEGORY_PROPERTY_SET_UINT(property, setter) CATEGORY_PROPERTY_SET_NSNUMBER_PRIMITIVE(unsigned int, property, setter, numberWithUnsignedInt)
#define CATEGORY_PROPERTY_GET_SET_UINT(property, setter) CATEGORY_PROPERTY_GET_UINT(property) CATEGORY_PROPERTY_SET_UINT(property, setter)
マクロCATEGORY_PROPERTY_GET_SET
は、指定されたプロパティのゲッターとセッターを追加します。読み取り専用または書き込み専用のプロパティは、それぞれCATEGORY_PROPERTY_GET
とCATEGORY_PROPERTY_SET
マクロを使用します。
プリミティブ型にはもう少し注意が必要です
プリミティブ型はオブジェクトではないため、上記のマクロにはunsigned int
、プロパティの型として使用する例が含まれています。これは、整数値をNSNumber
オブジェクトにラップすることによって行われます。したがって、その使用法は前の例と類似しています。
@interface ...
@property unsigned int value;
@end
@implementation ...
CATEGORY_PROPERTY_GET_SET_UINT(value, setValue:)
@end
このパターンに続き、あなたは単にもサポートするために、より多くのマクロを追加することができsigned int
、BOOL
などを...
制限事項
OBJC_ASSOCIATION_RETAIN_NONATOMIC
デフォルトでは、すべてのマクロが使用されています。
App CodeのようなIDE は現在、プロパティの名前をリファクタリングするときにセッターの名前を認識しません。自分で名前を変更する必要があります。