2010-11-04 16 views
15

में अपने स्वयं के प्रमुख मार्ग ऑपरेटरों को परिभाषित करना यह इस तरह @avg, @sum, आदि के रूप में, अपने स्वयं के प्रमुख मार्ग ऑपरेटरों को परिभाषित करने के ... संभव हैकोको

+2

मुझे खाना पकाने की साइट पर 'कोको' प्रश्न भेजने के लिए आग्रह करना पड़ता है ... –

+2

+1 यह वास्तव में एक आकर्षक सवाल है; एक जिसे मैंने कभी नहीं पूछा है, लेकिन जिसने कुछ वाकई दिलचस्प जानकारी प्रकट की है। पूछने के लिए धन्यवाद! –

उत्तर

14

संक्षिप्त उत्तर: किंडा। आप valueForKeyPath: को अपने कस्टम ऑपरेटर को अवरुद्ध करने या super पर अग्रेषित करने के लिए ओवरराइड कर सकते हैं, लेकिन यह समस्याग्रस्त हो सकता है (मैं पाठक को एक अभ्यास के रूप में स्पष्टीकरण छोड़ दूंगा)।

लंबा उत्तर: हाँ आप कर सकते हैं, लेकिन यह निजी व्यवहार (निजी एपीआई नहीं) का उपयोग करने पर निर्भर करता है।

NSArray में से कुछ साफ आत्मनिरीक्षण बाद, मैंने पाया कुछ निजी तरीके:

_distinctUnionOfSetsForKeyPath: 
_distinctUnionOfObjectsForKeyPath: 
_distinctUnionOfArraysForKeyPath: 
_unionOfSetsForKeyPath: 
_unionOfArraysForKeyPath: 
_unionOfObjectsForKeyPath: 
_minForKeyPath: 
_maxForKeyPath: 
_countForKeyPath: 
_avgForKeyPath: 
_sumForKeyPath: 

ठीक है, साफ! उन विधियों से आप ऑपरेटरों से मेल खाते हैं जो आप संग्रह के साथ उपयोग कर सकते हैं: @sum, @min, @max, @distinctUnionOfObjects, आदि @ को अंडरस्कोर के साथ बदल दिया गया है और हमें ForKeyPath: जोड़ा गया है।

तो ऐसा लगता है कि हम उपयुक्त हस्ताक्षर से मेल खाने के लिए एक नई विधि बना सकते हैं और हम जाने के लिए अच्छे हैं।

तो:

@interface NSArray (CustomOperator) 

- (id) _fooForKeyPath:(NSString *)keyPath; 

@end 

@implementation NSArray (CustomOperator) 

- (id) _fooForKeyPath:(NSString *)keyPath { 
    //keyPath will be what comes after the keyPath. In this example, it will be "self" 
    return @"Hello world!"; 
} 

@end 

NSArray * array = [NSArray arrayWithObjects:@"1", @"2", @"3", nil]; 
NSLog(@"%@", [array valueForKeyPath:@"@foo.SELF"]); //logs "Hello world!" 

यह काम करता है, लेकिन मुझे यकीन है कि मैं, इस पर निर्भर हैं, क्योंकि यह एक कार्यान्वयन विस्तार है कि भविष्य में बदल सकता है पर निर्भर करता है नहीं कर रहा हूँ।

+2

ओवरराइड '-valueForKey: 'इसके बजाय मैं चाहता था। एनएस डिक्शनरी इसे कैसे लागू करता है इस पर दस्तावेज़ पढ़ें। –

+1

@ लंबे समय तक माइक शायद यह स्थिर है, लेकिन ओवरराइडिंग की समस्या यह है कि ये ऑपरेटरों आमतौर पर केवल संग्रह पर उपयोगी होते हैं, और सबक्लासिंग संग्रह थोड़े बेकार होते हैं। :( –

+1

अच्छा लगता है डेव! हालांकि, जैसा कि आपने कहा था, यह एक द्वि-भंगुर प्रतीत होता है। आपको लगता है कि ओवरराइडिंग मूल्यफोरकेपथ: अधिक खतरनाक है? – cfischer

0

यह valueForKeyPath: अधिभावी और वहाँ में अपने स्वयं के कस्टम तर्क करके संभव है, लेकिन इसके लिए कोई ढांचा समर्थन नहीं है।