33

पर सबस्क्रिप्ट का उपयोग कर रहा NSArray रों के लिए नए ऑब्जेक्टिव-सी शाब्दिक वाक्य रचना आज़माने के लिए इस सरल कोड लिखा है:संकलक त्रुटि "उम्मीद विधि नहीं मिला" जब NSArray

NSArray *array = @[@"foo"]; 
NSLog(@"%@", array[0]); 

पहली पंक्ति ठीक काम करता है, लेकिन सबस्क्राइबिंग परिणाम एक त्रुटि में:

Expected method to read array element not found on object of type 'NSArray *'

बस सोच रहा है कि मैंने कुछ गलत किया है, या यदि शाब्दिक अभी तक पूरी तरह कार्यान्वित नहीं किए गए हैं। मैं ऐप्पल एलएलवीएम 4.0 के साथ संकलन कर रहा हूं और आईओएस 5 एसडीके का उपयोग कर रहा हूं।

यहां त्रुटि का एक स्क्रीनशॉट भी है। इस में अन्यथा फाउंडेशन वस्तुओं शाब्दिक वाक्य रचना की subscripting बिट के लिए आवश्यक तरीकों की जरूरत नहीं है * विशेष रूप से -

Error

+0

ऑब्जेक्टिव-सी के बारे में clang.llvm.org पर पेज सचमुच बताते हैं कि आपको नई सुविधाओं का उपयोग करने के लिए ऐप्पल एलएलवीएम 4.0 या क्लैंग v3.1 का उपयोग करना होगा। क्या आपके पास इनमें से कोई एक स्थापित है, और क्या यह आपकी बिल्ड सेटिंग्स में निर्दिष्ट है? –

+0

हां मैं एलएलवीएम 4.0 का उपयोग कर रहा हूं। उल्लेख किया जाना चाहिए कि –

+3

आपको आईओएस 6 या ओएस एक्स 10.8 एसडीके के साथ संकलन करना होगा - अन्यथा फाउंडेशन ऑब्जेक्ट्स में शाब्दिक वाक्यविन्यास के सबस्क्रिप्टिंग बिट के लिए आवश्यक विधियां नहीं हैं। –

उत्तर

36

आप iOS 6 या ओएस एक्स 10.8 SDKs साथ संकलन किया जाना है मिल गया है। मामला, सबस्क्रिप्टिंग objectAtIndexedSubscript: को NSArray द्वारा कार्यान्वित करने की अपेक्षा करता है, और यह एक नई विधि है जो इस कंपाइलर सुविधा के साथ बातचीत करने के लिए बनाई गई थी। नए सिंटैक्स के कुछ हिस्सों को केवल ऑब्जेक्ट सृजन के साथ करना है, ठीक काम करना चाहिए, हालांकि - मुझे विश्वास नहीं है कि किसी भी नई विधि की आवश्यकता है।

इसके अलावा http://clang.llvm.org/docs/ObjectiveCLiterals.html


पर पढ़ने * मैं अनुसंधान के एक बिट borrrden द्वारा किया जाता आधार पर आप इसका: https://stackoverflow.com/a/11407844/603977

मैं इस जवाब पर upvotes का एक बहुत मिल गया है, जो मैं वास्तव में महसूस borrrden पर स्थापित किया गया है। कृपया, अगर आपको लगता है कि मेरा जवाब अपवर्तनीय है, तो वहां क्लिक करें और वहां वोट दें।

+2

एक छोटी सी बात है जिसके बारे में मुझे चेतावनी देना है। इस वजह से शाब्दिक बूल भी समर्थित नहीं हैं। हालांकि, त्वरित सुधार है कि मैं लागू किया (एक iOS परियोजना में), मेरा हेडर से एक की शुरुआत करने के लिए इस जोड़ने था -> '#ifndef __IPHONE_6_0 #if __has_feature (objc_bool) #undef हाँ #undef नहीं # परिभाषित हाँ #define __objc_yes नहीं __objc_no #endif # endif' – borrrden

+1

क्यों subscripting सिर्फ objectAtIndex (यदि objectAtIndexedSubscript नहीं पाया जाता है, या केवल -iOS6 पर) का उल्लेख नहीं है? –

+1

यह एक अच्छा सवाल है, @ जोनाथन। –

15

आप iOS 6 या ओएस एक्स 10.8 लक्षित नहीं करते हैं, तो मैं कहना है कि यह अभी भी काम करने के लिए subscripting पाने के लिए उल्लेखनीय आसान है करना चाहते हैं। आपको बस इतना करना है कि आवश्यक वर्गों को उस वर्ग के रूप में जोड़ें, जिसे आप सब्सक्राइब करना चाहते हैं, और उन विधियों को उचित रूप से कार्यान्वित करें।

NSArray: - (id)objectAtIndexedSubscript: (NSUInteger)index;

NSMutableArray: - (void)setObject: (id)obj atIndexedSubscript: (NSUInteger)index;

NSDictionary: - (id)objectForKeyedSubscript: (id)key;

NSMutableDictionary: तो निम्न वर्गों के तरीकों को जोड़ने के - (void)setObject: (id)obj forKeyedSubscript: (id)key;

इस को लागू उचित बुला के रूप में एक सरल है कक्षा के लिए विधि। उदाहरण के लिए, NSArray पर subscripting तुम सिर्फ लागू लागू करने के लिए:

- (id) objectAtIndexedSubscript:(NSUInteger)index{ 
    return [self objectAtIndex:index]; 
} 

केवल नकारात्मक पक्ष यह है मैं देख सकता हूँ कि आप किसी भी वर्ग कि subscripting के प्रयोग पर इरादा रखता है में अपने वर्ग आयात करने के लिए सुनिश्चित करने की आवश्यकता है। बेशक, आप अपने उपसर्ग शीर्षलेख में #import समेत उस आवश्यकता को प्राप्त कर सकते हैं, आमतौर पर फ़ाइल: <appname>-Prefix.pch। (जोश कैसवेल को इंगित करने के लिए धन्यवाद)।

एक उलझन में आप अपनी आवश्यकताओं के अनुरूप सबस्क्रिप्टिंग विधियों को बदल सकते हैं।उदाहरण के लिए, एप्पल आप subscripting का उपयोग कर NSMutableArray में जोड़ने के लिए/वस्तुओं को हटाने की अनुमति नहीं है, लेकिन यह आसानी से पर्याप्त पूरा किया जा सकता:

तुम बस जोड़ सकते हैं:

- (void) setObject:(id)obj atIndexedSubscript:(NSUInteger)index{ 
    if (index < self.count){ 
     if (obj) 
      [self replaceObjectAtIndex:index withObject:obj]; 
     else 
      [self removeObjectAtIndex:index]; 
    } else { 
     [self addObject:obj]; 
    } 
} 
+0

«आपको अपनी श्रेणी को किसी भी वर्ग में आयात करना सुनिश्चित करना है जो सबस्क्रिप्टिंग का उपयोग करने का इरादा रखता है» कोई समस्या नहीं है; बस इसे अपने उपसर्ग शीर्षलेख में रखें! अच्छा लेख! –

+0

धन्यवाद @ जोश कैसवेल! मैं उपसर्ग के बारे में भूल गया था। मैंने आपकी जानकारी शामिल करने के लिए पोस्ट संपादित किया। –

+0

बहुत अच्छी चाल है। – KPM

2

मैं this link से निम्नलिखित कोड मिला इस श्रेणी को NSObject और संग्रह सबस्क्रिप्शन काम करेगा। मैंने इसे अपनी .pch फ़ाइल में रखा है।

// Add support for subscripting to the iOS 5 SDK. 
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000 
@interface NSObject (SubscriptingSupport) 

- (id)objectAtIndexedSubscript:(NSUInteger)idx; 
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx; 
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; 
- (id)objectForKeyedSubscript:(id)key; 

@end 
#endif 

बेशक आप बजना के नवीनतम संस्करण जो XCode 4.4 में पहले से ही है की आवश्यकता होगी।

+0

यह वास्तव में अच्छी तरह से काम करता है और अन्य उत्तरों की तुलना में वास्तव में सरल है। धन्यवाद! – pigoz

+0

यह हारून के उत्तर से अलग कैसे है? –

+0

उनका उत्तर कई श्रेणियों को बनाने का सुझाव देता है। यह एक आसान तरीका है क्योंकि आपको केवल एक श्रेणी बनाने की आवश्यकता है। हालांकि यह अनुभवी डेवलपर्स के लिए स्पष्ट हो सकता है, यह उन डेवलपर्स के लिए कम स्पष्ट होने की संभावना है जो श्रेणियों के लिए नए हैं। –

2

मुझे एक ही समस्या मिली, लेकिन फिर यह आईओएस संस्करण की कमी के बी/सी नहीं था .. लेकिन यह इसलिए था क्योंकि मूल सरणी की बजाय NSArray के रूप में सेट की गई थी। इसे NSMutableArray में बदलने के लिए यह मेरे लिए तय किया गया है

0

मैं इसे जोड़ रहा हूं क्योंकि यह एक सामान्य त्रुटि है जो अभी भी 7/2015 के रूप में एक्सकोड में मौजूद है और इसे हल करने के तरीके को समझना आसान नहीं है।

ऑब्जेक्ट का उदाहरण बनाये बिना ऑब्जेक्ट पर किसी विधि को कॉल करने का प्रयास करते समय मुझे यह त्रुटि मिली। मेरा समाधान ऑब्जेक्ट का उदाहरण बनाना था, फिर उस ऑब्जेक्ट के उदाहरण पर प्रॉपर्टी पर विधि को कॉल करें।

उदाहरण: क्या काम नहीं किया: [आत्म methodCall: arrayItem]

[self tappedUser:self.activities[indexPath.row].followItem.user.givenName]; 

यह क्या तय (नीचे पूर्ण उदाहरण देखें): क्लास newObject = arrayItem; [आत्म methodCall: newObject] (नीचे पूर्ण उदाहरण देखें)

FollowActivityItem *followItem = self.activities[indexPath.row]; 
[self tappedUser:followItem.user.givenName]; 
0

अपने ज फाइल करने के लिए #import <Foundation/Foundation.h> जोड़ने के लिए, और प्रयोग एक के बजाय NSMutableArray

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