2011-02-07 15 views
8

में कस्टम प्रॉपर्टी विशेषताएँ कस्टम संपत्ति विशेषताओं को उद्देश्य-सी में VB.NET की तरह बनाया जा सकता है? उदाहरण के लिए, वीबी.नेट में आप "ब्राउज़ करने योग्य" विशेषता बना सकते हैं और इसे निर्धारित करने के लिए रनटाइम पर पढ़ सकते हैं कि आपको कोई संपत्ति प्रदर्शित करनी चाहिए या नहीं।उद्देश्य-सी

Public Class Employee 
    <Browsable(True)> _ 
    Public Property Property1() As String 
     Get 

     End Get 
     Set(ByVal Value As String) 

     End Set 
    End Property 

    <Browsable(False)> _ 
    Public Property Property2() As String 
     Get 

     End Get 
     Set(ByVal Value As String) 

     End Set 
    End Property 
End Class 

मैं ऑब्जेक्टिव-सी में भी ऐसा ही है, भले ही यह एक निश्चित विशेषता केवल संकलन समय पर सेट किया जा सकता है कि और सब पर बदला नहीं जा सकता है करना चाहते हैं।

जो मैं करने की कोशिश कर रहा हूं वह यह निर्धारित करने के लिए कि मेरी संपत्ति को क्रमबद्ध किया जाना चाहिए या नहीं, यह निर्धारित करने के लिए मेरी कक्षा के गुणों में एक विशेषता जोड़ना है।

मुझे मानक उद्देश्य-सी विशेषताओं (केवल पढ़ने, nonatomic, आदि) पता है, लेकिन वे मेरी मदद नहीं करते हैं ... जब तक कि आप उनका उपयोग करने का एक रचनात्मक तरीका नहीं है। मैंने __attribute__(("Insert attribute here")) कीवर्ड के साथ सी विशेषताओं का उपयोग करने में भी देखा, लेकिन सी में विशिष्ट गुण हैं जो विशिष्ट उद्देश्यों को पूरा करते हैं, और मुझे यह भी यकीन नहीं है कि आप उन्हें रनटाइम पर पढ़ सकते हैं। अगर मुझे कोई याद आती है जो मेरी मदद कर सकती है, तो मुझे बताएं।

मैंने typdef का उपयोग करने का प्रयास किया। उदाहरण के लिए:

typdef int serializableInt; 
serializableInt myInt; 

और property_getAttributes() ऑब्जेक्टिव-सी क्रम फ़ंक्शन का उपयोग करें, लेकिन सभी यह बताता है मुझे उस मींट एक पूर्णांक है। मुझे लगता है कि टाइपपेफ इस मामले में एक मैक्रो की तरह काफी है ... जब तक कि मैं रनटाइम पर serializableInt प्रकार का एक चर बना सकता हूं। किसी भी तरह, से प्राप्त मूल्यों पर यहां Apple's documentation है।

दूसरी आवश्यकता यह है कि इस विशेषता को NSObject उप-वर्गों के साथ-साथ आदिम डेटा प्रकारों के साथ काम करना है। मैंने कक्षा में एक ब्लैक सूचियों या श्वेत सूचियों को एक ivar के रूप में जोड़ने के विचार के बारे में सोचा जो मुझे बताएगा कि कौन से गुण छोड़ने या क्रमबद्ध करने के लिए, जो मूल रूप से एक ही विचार है। मैं सिर्फ उस काले/सफेद सूची को विशेषताओं में स्थानांतरित करने की कोशिश कर रहा हूं, इसलिए जब आप किसी वर्ग की शीर्षलेख फ़ाइल देखते हैं तो यह समझना आसान होता है, यह मेरे द्वारा बनाई गई किसी भी कक्षा में सुसंगत है और यह कम त्रुटि प्रवण है।

इसके अलावा, यह विचार करने के लिए कुछ है। मुझे वास्तव में मूल्य (सत्य या गलत; 1, 2, 3; या जो भी हो) की विशेषता की आवश्यकता नहीं है क्योंकि विशेषता स्वयं ही मान है। यदि विशेषता मौजूद है, तो क्रमबद्ध करें; अन्यथा, छोड़ें।

किसी भी मदद की सराहना की जाती है। यदि आप निश्चित रूप से जानते हैं कि उद्देश्य-सी पर यह संभव नहीं है, तो मुझे बताएं। धन्यवाद।

+1

कैसे एक वर्ग विधि उस के साथ एक सरणी रिटर्न बनाने के बारे में धारावाहिक उदाहरण चर के नाम? –

+0

मैंने इसके बारे में सोचा और यह एक आदर्श समाधान है। लेकिन मेरा सवाल विशेष रूप से विशेषताओं के साथ इस समस्या को हल करने के बारे में है। उद्देश्य-सी में कस्टम गुण भी मौजूद हैं? – Roberto

उत्तर

1

जब तक मैं अपनी बात नहीं छूटा है ...

मैं एक प्रोटोकॉल की घोषणा की सलाह देते हैं। फिर ओबीजेसी ऑब्जेक्ट्स के उदाहरणों का प्रयोग प्रोटोकॉल को अपनाने वाले आपके ओबीजेसी कक्षाओं में चर के रूप में करते हैं।

@interface MONProtocol 

- (BOOL)isSerializable; 
- (BOOL)isBrowsable; 

/* ... */ 

@end 

@interface MONInteger : NSObject <MONProtocol> 
{ 
    int value; 
} 

- (id)initWithInt:(int)anInt; 

@end 

@interface MONIntegerWithDynamicProperties : NSObject <MONProtocol> 
{ 
    int value; 
    BOOL isSerializable; 
    BOOL isBrowsable; 
} 

- (id)initWithInt:(int)anInt isSerializable:(BOOL)isSerializable isBrowsable:(BOOL)isBrowsable; 

@end 

// finally, a usage 
@interface MONObjectWithProperties : NSObject 
{ 
    MONInteger * ivarOne; 
    MONIntegerWithDynamicProperties * ivarTwo; 
} 

@end 

यदि आप कुछ कार्यान्वयन साझा करना चाहते हैं, तो बस NSObject subclass और बेस क्लास का विस्तार करें।

आपके पास उन प्रकारों/संरचनाओं के लिए लिखने के लिए कुछ प्रकार होंगे जिन्हें आप प्रस्तुत करना चाहते हैं।

+0

मुझे लगता है कि आप उसकी बात याद कर चुके हैं।वह यह नहीं कहना चाहता कि ऑब्जेक्ट ब्राउज़ करने योग्य या क्रमिक है, लेकिन ऑब्जेक्ट के भीतर एक संपत्ति धारावाहिक या ब्राउज़ करने योग्य है। –

+0

@ncipollina कोई संपत्ति विशेषता नहीं है, इसलिए मैंने संरचना की सिफारिश की। – justin

0

मैं इसी तरह के मुद्दे को सीरियलाइजिंग ऑब्जेक्ट्स में आया हूं। मेरा समाधान @property (nonatomic, readonly) NSArray *serialProperties; जोड़ना है जिसमें एक कस्टम गेटर है जो इस (उप-वर्ग) के गुणों के नाम (NSString *) को वापस भेजता है जिसे क्रमबद्ध किया जाना चाहिए।

उदाहरण के लिए:

- (NSArray *)serialProperties { 
    return @[@"id", @"lastModified", @"version", @"uid"]; 
} 

या एक उपवर्ग में:

- (NSArray *)serialProperties { 
    NSMutableArray *sp = [super serialProperties].mutableCopy; 
    [sp addObject:@"visibleName"]; 
    return sp; 
} 

फिर आप आसानी से [self dictionaryWithValuesForKeys:self.serialProperties] के माध्यम से सभी गुण और उनके मान प्राप्त कर सकते हैं।

+0

@ बेवारियस ने पहले से ही इस प्रस्ताव को टिप्पणियों में बनाया है- हालांकि उन्होंने एक वर्ग विधि का उपयोग किया जो इसे हल करने के लिए एक आम तरीका है। रॉबर्टो ने स्पष्ट रूप से कहा कि सवाल गुणों पर कस्टम "विशेषताओं" के बारे में है। –

+0

क्षमा करें, मुझे उस टिप्पणी को याद करना होगा। हो सकता है कि मेरे स्निपेट अभी भी काम में आ सकें;) हालांकि, AFAIK उद्देश्य-सी में "विशेषताओं" जैसी कुछ भी नहीं है। –

+0

खैर, गुणों में ओबीजेसी-रनटाइम में गुण होते हैं (जैसे रीडोनली, परमाणु, गतिशील, कमजोर, ...)। उन विशेषताओं को पूछताछ की जा सकती है-फिर भी वे विस्तार योग्य नहीं हैं। –

1

मैंने जो अन्य उत्तरों को अब तक देखा है, उनके साथ कमी यह है कि उन्हें आवृत्ति विधियों के रूप में लागू किया गया है, यानी, आपको इस मेटाडेटा से पूछने से पहले एक उदाहरण पहले से ही होना चाहिए। शायद ऐसे मामलों में जहां कि उचित एज हैं, लेकिन कक्षाओं के बारे में मेटाडेटा वर्ग तरीके के रूप में लागू किया जाना चाहिए, एप्पल करता है बस के रूप में, उदाहरण के लिए:

+ (BOOL)keyIsBrowsable:(NSString*)key { } 

:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key { } 

हम अपने समान पंक्तियों के साथ कल्पना कर सकता या

+ (NSArray*)serializableProperties { } 

की हमारी कक्षा FOOBar कहा जाता है की कल्पना करते हैं, और हम जानना चाहते हैं कि क्या baz कुंजी browsabl है ई। एक FOOBar हम सिर्फ कह सकते हैं बनाए बिना:

if ([FOOBar keyIsBrowsable:@"baz"]} { ... } 

आप इस तकनीक है कि कस्टम विशेषताओं के साथ किया जा सकता है के साथ काफी कुछ भी कर सकते हैं। (Serializable जैसी चीजों को छोड़कर, जिसे कंपाइलर, आईआईआरसी से सहयोग की आवश्यकता होती है।) कस्टम विशेषताओं के बारे में अच्छी बात यह है कि मेटाडेटा क्या है और उस वर्ग की वास्तविक कार्यक्षमता के लिए आंतरिक क्या है, इस पर एक अंतर में अंतर करना आसान है, लेकिन मुझे लगता है कि यह मामूली लाभ है।

(बेशक, आपको keyIsBrowsable: चयनकर्ता के अस्तित्व की जांच करनी पड़ सकती है, जैसे कि आपको एक विशिष्ट कस्टम विशेषता के अस्तित्व की जांच करनी होगी। फिर, कस्टम विशेषताओं का यहां थोड़ा सा पैर है, क्योंकि हम उन्हें सभी को देने के लिए .NET रनटाइम बता सकते हैं।)

0

आप एसडीके प्रदान किए गए अतिरिक्त गुणों को जोड़ नहीं सकते हैं .. । लेकिन एक काम अपने उद्देश्य को पाने के लिए चारों ओर है ...

@interface classTest:NSObject 

    @property(strong,nonatomic)NSString *firstName; 

    @property(strong,nonatomic)NSString *lastName; 

    @property(strong,nonatomic)NSMutableDictionary *metaData; 

@end 
@implementation classTest 

- (id) init 
{ 

self = [super init]; 
//Add meta data 
    metaData=[[NSmutableDictionary alloc]init]; 

    // 
    if(!self) return nil; 
    return self; 
} 

@end 

तो मेटा डेटा जोड़ने और पुनः प्राप्त करने के शब्दकोश का उपयोग करें ...

मैं आशा है कि यह मदद करता है ....

1

यदि आप संपत्ति, कक्षा, विधि या ivar में विशेषता जोड़ना चाहते हैं, तो आप github.com/libObjCAttr का उपयोग करने का प्रयास कर सकते हैं। यह, का उपयोग cocoapods के माध्यम से इसे जोड़ने के लिए वास्तव में आसान है, और फिर आप उस तरह विशेषता जोड़ सकते हैं:

@interface Foo 

RF_ATTRIBUTE(YourAttributeClass, property1 = value1) 
@property id bar; 

@end 

और कोड में:

YourAttributeClass *attribute = [NSDate RF_attributeForProperty:@"bar" withAttributeType:[YourAttributeClass class]]; 
// Do whatever you want with attribute, nil if no attribute with specified class 
NSLog(@"%@", attribute.property1)