2013-04-30 9 views
7

में आईडी से कक्षा तक डायनामिक टाइप कास्ट मैं उद्देश्य सी और गति उदाहरण गुणों में गतिशील रूप से डालना चाहता हूं। यहाँ एक छद्म कोड:उद्देश्य सी

id obj; 
if (condition1) 
    obj = (Class1*)[_fetchedResults objectAtIndex:indexPath.row]; 
else 
    obj = (Class2*)[_fetchedResults objectAtIndex:indexPath.row]; 

NSNumber *latitude = obj.latitude; 

फिर संकलक मुझसे कहता है निम्नलिखित: संपत्ति 'अक्षांश' प्रकार की वस्तु पर नहीं मिला 'आईडी __strong'

या तो Class1 और Class2 कोर डेटा संस्थाओं कर रहे हैं और लगभग एक ही तरह के गुण हैं। स्थिति 1 _fetchedResults कक्षा 1 के प्रकार की वस्तुएं लौटाता है और स्थिति 2 _fetchedResults कक्षा 2 प्रकार की वस्तुएं लौटाता है।

क्या कोई मुझे इस तरह की समस्या को हल करने का संकेत दे सकता है?

धन्यवाद!

+0

मुझे लगता है कि आपको पहले यह सुनिश्चित करना चाहिए कि [_fetchedResults objectAtIndex: indexPath.row] रिटर्न क्लास अक्षांश गुण है। साथ ही, किसी NSManagedObject प्रकार को किसी NSManagedObject प्रकार को कास्टिंग करना गलत है। जब भी आप एक NSManagedObject उदाहरण बनाते हैं तो आपको एक NSManagedObjectContext की आवश्यकता होती है। –

उत्तर

4

आप कोडिंग (KVC) कुंजी-मान के माध्यम से गुण का उपयोग कर सकते हैं:

[obj valueForKey:@"latitude"] 
+0

ध्यान दें कि ऐसा करने के लिए केवीसी का उपयोग करने से आप कंपाइलर से किसी भी प्रकार की जांच कर सकते हैं। – ipmcc

+3

@ipmcc निश्चित रूप से, लेकिन पहले आईडी में 'id' का उपयोग कर रहा है :-) – Monolo

+0

@Monolo यह अनावश्यक है और इसका प्रभाव [obj अक्षांश] – hooleyhoop

1

obj चर एक प्रकार प्रश्न में संपत्ति है की की जरूरत है। यदि दोनों संस्थाओं की एक ही संपत्ति है, तो इसे हासिल करने का एक तरीका संपत्ति के लिए एक सामान्य आधार वर्ग पर घोषित किया जाएगा।

@protocol LatitudeHaving 
@property (copy) NSNumber* latitude; 
@end 

@interface Class1 (AdoptLatitudeHaving) <LatitudeHaving> 
@end 

@interface Class2 (AdoptLatitudeHaving) <LatitudeHaving> 
@end 

वहाँ से, आप एक id<LatitutdeHaving>, इस तरह के रूप में obj घोषणा करेंगे: यदि यह उचित नहीं है इन दो प्रकार के एक आम आधार वर्ग साझा करने के लिए है, तो आप उन्हें एक आम प्रोटोकॉल, इस तरह अपनाने हो सकता है:

id<LatitudeHaving> obj; 
if (condition1) 
    obj = (Class1*)[_fetchedResults objectAtIndex:indexPath.row]; 
else 
    obj = (Class2*)[_fetchedResults objectAtIndex:indexPath.row]; 

NSNumber *latitude = obj.latitude; 

और ऐसा करना चाहिए। एफडब्ल्यूआईडब्ल्यू, प्रोटोकॉल जावा में इंटरफेस के समान हैं।

+0

कक्षा 1 * और कक्षा 2 * के लिए क्या हैं? – hooleyhoop

+0

'objectAtIndex:' 'id 'को' id <अक्षांश हैविंग> 'नहीं देता है। संकलक शिकायतों से बचने के लिए उन जानवरों को कड़ाई से जरूरी नहीं हो सकता है, लेकिन मैं ओपी के कोड के करीब कोड को यथासंभव बनाने की कोशिश कर रहा था। – ipmcc