दिया गया उत्तर बहुत अच्छा काम करता है और मेरा प्रस्ताव इसका केवल एक विस्तार है जो बहुत अधिक बॉयलरप्लेट कोड लिखने से बचता है।
श्रेणी के गुणों के लिए बार-बार गेटटर और सेटर के तरीकों को लिखने से बचने के लिए यह उत्तर मैक्रोज़ का परिचय देता है। इसके अतिरिक्त ये मैक्रो आदिम प्रकार के गुणों जैसे कि int
या के उपयोग को आसान बनाते हैं BOOL
।
मैक्रों के बिना पारंपरिक दृष्टिकोण
परंपरागत रूप से आप एक श्रेणी की संपत्ति जैसे परिभाषित करते हैं
@interface MyClass (Category)
@property (strong, nonatomic) NSString *text;
@end
तो फिर तुम एक का उपयोग कर एक गेटर और सेटर विधि लागू करने की आवश्यकता जुड़े वस्तु और चयनकर्ता प्राप्त कुंजी (के रूप में मूल उत्तर देखें ):
#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
डिफ़ॉल्ट रूप से उपयोग कर रहे हैं ।
ऐप कोड जैसी आईडीई वर्तमान में संपत्ति के नाम को रीफ़ैक्ट करने पर सेटर के नाम को नहीं पहचानती है। आपको इसका नाम बदलकर स्वयं करना होगा।