2011-08-17 19 views
7

मैं कभी-कभी अपने तत्वों को व्यवस्थित करने में सहायता के लिए आईबी तत्वों को NSArray में व्यवस्थित करना चाहता हूं। अक्सर, वस्तुओं के विभिन्न वर्ग इसे एक दूसरे के साथ एक ही सरणी में बनाते हैं।- ऑब्जेक्ट टाइप उपेक्षा?

NSArray *array = [NSArray arrayWithObjects:((UITextField *)textField), ((UISegmentedController *)segmentedController), nil]; 

मैं क्यों मिलता है जब मैं संदेश "चयनकर्ता का जवाब नहीं है": एक ओर जहां यह है संगठन के लिए एक सुविधाजनक तरीका है, मैं चारों ओर क्यों करता है, तो मैं इस तरह एक सरणी है मेरे सिर लपेटो नहीं कर पा रहे इस तरह की एक for पाश डाल:

for (UITextField *text in array) { 
    [text setText:@""]; 
} 

for पाश ऑब्जेक्ट वर्ग UITextField के नहीं हैं पारित किया जा रहा है।

ऑब्जेक्ट की कक्षा घोषित करने का क्या मतलब है यदि निर्दिष्ट सरणी में सभी ऑब्जेक्ट लूप के माध्यम से पारित हो जाते हैं?

for (id *object in array) { 
    if ([object isMemberOfClass:[UITextField class]]) { 
     foo(); 
    } else if ([object isMemberOfClass:[UISegmentedController class]) { 
     bar(); 
    } 
} 
+0

'आईडी' पहले से ही एक सूचक प्रकार है। 99.9% समय, आप सादे 'आईडी' प्रकार का उपयोग करना चाहते हैं, न कि एक आईडी आईडी * के सूचक। –

उत्तर

10

जब आप ऐसा करेंगे

for (UITextField *text in... 

सरणी से वस्तु संकेत करने के लिए UITextField * प्रकार डाली कर रहे हैं - यदि ऐसा है तो वस्तु वास्तव में एक UITextField नहीं है, अजीब चीजों के सभी प्रकार यदि आप कॉल करने के लिए कोशिश हो सकता है UITextField विधियों।

for (id obj in array) 

फिर प्रकार की जांच के रूप में आप कर सकते हैं और उचित तरीके फोन:

बजाय id प्रकार (कोई * जरूरत, Btw) का उपयोग करें। या, सरणी फ़िल्टर कर एक खास प्रकार के केवल वस्तुओं को पाने के लिए है, तो यह है कि प्रकार केवल जाना:

for (UITextField* text in [array filteredArrayUsingPredicate:...]) 

संपादित करें:

Is it possible to filter an NSArray by class?

+0

वस्तुओं को नए प्रकारों में नहीं डाला जाता है - पॉइंटर्स हैं। जब संदेशों को प्रेषित करने की बात आती है तो पॉइंटर का प्रकार एक श्वेत नहीं है। यदि आप चाहते हैं तो 'NSWindow *' प्रकार के सूचक का उपयोग करके किसी ऑब्जेक्ट में '-appendString:' भेज सकते हैं, और जब तक पॉइंटर वास्तव में NSMutableString के उदाहरण को इंगित करता है तब तक यह ठीक काम करेगा। (आपको एक कंपाइलर चेतावनी मिल सकती है, लेकिन यह काम करेगी।) यदि पॉइंटर एक विंडो को इंगित करता है, हालांकि, आपको निश्चित रूप से रनटाइम पर एक त्रुटि मिल जाएगी जबतक कि आप इसे रोकने के लिए कदम नहीं उठाते। – Caleb

+0

आप निश्चित रूप से सही हैं, मैंने तदनुसार अपना जवाब संशोधित कर दिया है। – SVD

+0

जिस भाग को संपादन की आवश्यकता है वह यह है कि "यदि वस्तु वास्तव में एक यूआईटीएक्स्टफिल्ड नहीं है, तो अजीब चीजों के सभी प्रकार हो सकते हैं ..."। यदि वस्तु वास्तव में एक UITextField नहीं है, तो आपको एक अनुपूरक चयनकर्ता अपवाद मिलेगा। – Caleb

5

क्या वस्तु की क्लास की घोषणा की बात करता है, तो निर्दिष्ट सरणी में सभी वस्तुओं को पारित कर रहे हैं है:

संपादित बस संदर्भ के लिए, यह कैसे मैं अब के रूप में यह से निपटने कर रहा हूँ है लूप के माध्यम से?

कक्षा का नाम केवल कंपाइलर को यह जानने के लिए है कि उसे क्या उम्मीद करनी चाहिए। इससे यह पता लगाने की कोशिश की जा सकती है कि आपको किस तरीके से कॉल करना चाहिए और आप ऑब्जेक्ट का इलाज कैसे कर सकते हैं। float लेते हुए एक विधि में int में गुजरने जैसा ही विचार है। विधि इनट्स को अनदेखा नहीं करेगी - ऐसा लगता है कि आप सही प्रकार से गुजर रहे हैं। आप इस वजह से इसे थोड़ा अधिक क्रेडिट दे रहे हैं:

for (UITextField *text in array) 

इसमें यह कार्यक्षमता नहीं है। आप इसे कैसे संभालेंगे अब सही तरीका है।

0

क्या आपको यकीन है: यहाँ वर्ग फिल्टर विधेय का निर्माण करने का तरीका बताया आपको कोई त्रुटि नहीं मिलती है जब आप रन कोड? "चयनकर्ता का जवाब नहीं देता" संदेश एक रनटाइम त्रुटि है, संकलन समय त्रुटि नहीं।कंपाइलर को पता नहीं है कि सरणी में ऑब्जेक्ट -setText: लागू करते हैं, लेकिन जब आप वास्तव में उस संदेश को UISegmentedControl के उदाहरण पर भेजते हैं तो आपको निश्चित रूप से एक त्रुटि प्राप्त करनी चाहिए।

एक और संभावना यह है कि आपको UISegmentedController नामक एक कक्षा मिली है जिसमें -setText: विधि है। कक्षा का नाम जो बहु-भाग बार-ग्राफ-दिखने वाले उपयोगकर्ता इंटरफ़ेस विजेट को लागू करता है UISegmentedControl है। तो या तो जो कोड आप दिखा रहे हैं वह वास्तविक, परीक्षण कोड नहीं है, या आपके पास एक कक्षा है जिसे हम नहीं जानते हैं।

संबंधित मुद्दे