2012-08-21 11 views
11

में पहले तत्व के लिए कीपैथ यह उदाहरण दूषित है, लेकिन यह मेरा बिंदु दिखाता है।एम्बेडेड एनएसएआरएआर

तो, मैं निम्नलिखित की तरह एक वस्तु ग्राफ है, तो:

{ 
sex = male; 
uid = 637650940; 
work = ({ 
    employer = { 
     id = 116420715044499; 
     name = "Software Engineer"; 
    }; 
    "end_date" = "0000-00"; 
    "start_date" = "0000-00"; 
}, { 
    employer = { 
     id = 188733137832278; 
     name = "Apple"; 
    }; 
}); 
}, 
//Some more objects 

(यह एक NSArray NSDictionarys प्रकार NSArray का एक उद्देश्य है कि युक्त है)।

कुंजी फ़ील्ड work है। मुझे एक महत्वपूर्ण पथ चाहिए जो work सरणी में पहली वस्तु लेगा।

अगर मैं ऐसा करते हैं:

NSArray* work = [outerArrayObject objectForKey: @"work"]; 
id name = [work valueForKeyPath: @"employer.name"]; 

मैं प्रत्येक नाम युक्त एक सरणी मिल (ऊपर मामले में, सॉफ्टवेयर इंजीनियर & एप्पल)। क्या पहले ऑब्जेक्ट को वापस करने के लिए कोई संग्रह ऑपरेटर या कुछ है? बोनस अंक अगर आप प्रारंभ_तिथि द्वारा प्रत्येक कार्य को सॉर्ट करने के लिए एक कुंजी पथ विकसित कर सकते हैं भी

उत्तर

15

खैर :) मेरे अपने सवाल का जवाब देने का एक तरीका यह करने के लिए यह है:

1) निम्न श्रेणी को परिभाषित करें

@implementation NSArray (CustomKVOOperators) 

- (id) _firstForKeyPath: (NSString*) keyPath { 
    NSArray* array = [self valueForKeyPath: keyPath]; 
    if([array respondsToSelector: @selector(objectAtIndex:)] && 
     [array respondsToSelector: @selector(count)]) { 
     if([array count]) 
      return [array objectAtIndex: 0]; 
     else 
      return nil; 
    } 
    else { 
     return nil; 
    } 
} 

@end 

2) this clever person को यह मुख्यपथ वाक्य रचना का उपयोग करें

NSArray* work = [outerArrayObject objectForKey: @"work"]; 
id name = [work valueForKeyPath: @"@first.employer.name"]; 

धन्यवाद।

+0

के मामले में '' 'outerArrayObject''' अपनी मूल है? – Coughlin

+0

@PauldeLange _firstForKeyPath क्या है, क्या यह निजी एपीआई है? – onmyway133

+0

कोई निजी एपीआई –

14

@PauldeLange - आपका उत्तर और लिंक सहायक थे।
निम्नलिखित सरल संस्करण भी काम करता है (कम से कम Xcode 6 के रूप में)

id name = [work valueForKeyPath: @"[email protected]”]; 

ऊपर 'फर्स्टऑब्जेक्ट' में NSArray पर पूर्वनिर्धारित विधि को दर्शाता है।

@implementation NSArray (CustomKVOOperators) 

- (id) secondObject { 
    return [self count] >=2 ? self[1] : nil; 
} 
@end 

और उपयोग: दूसरी वस्तु की जरूरत है, तो आप निम्न परिभाषित कर सकते हैं

id name = [work valueForKeyPath: @"[email protected]”]; 
+0

अच्छा खोज और अच्छा अपडेट! यह अब –

+2

करने का एक बेहतर तरीका है। मुझे "यह कक्षा पहले ऑब्जेक्ट ऑपरेशन को लागू नहीं करती है" – Injectios

+0

@ इंजेक्शनियो आप इसे अभी तक हल कर सकते हैं। आपके उपयोग में संभावित रूप से डेटा ऑब्जेक्ट (कार्य) संचालित किया जा रहा है, यह एक एनएसएआरएआरई नहीं है। – Parmesh