2009-03-12 9 views
25

मैं उद्देश्य-सी में स्ट्रिंग प्रकार की दो आयामी सरणी कैसे घोषित करूं?उद्देश्य-सी में स्ट्रिंग प्रकार की दो आयामी सरणी कैसे घोषित करें?

+0

यदि आप एनएस (उत्परिवर्ती) ऐरे की बात कर रहे हैं, तो आप इसे "घोषित" नहीं करते हैं। एक एनएसएआरएआरई में कोई असाइन किया गया सामग्री प्रकार नहीं है, इसलिए आप बाहरी सरणी घोषित करते हैं। आप इसका उपयोग कैसे करते हैं आप पर निर्भर है। मुझे बहुत सारे टाइपिंग को बचाने के लिए –

उत्तर

44

सबसे पहले, आप अपने आंतरिक सरणी के तारों को पकड़ने के लिए कक्षा का उपयोग करने पर विचार कर सकते हैं, या इसे एक प्लेस्ट फ़ाइल से लोड कर सकते हैं (जिसमें तारों की 2 डी सरणी बनाना आसान है)।

प्रत्यक्ष घोषणाओं के लिए, आपके पास कुछ विकल्प हैं। आप एक NSArray का उपयोग करना चाहते हैं, तो आप मैन्युअल रूप से इस तरह की संरचना बनाना होगा:

NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ] 
: या सरणी शाब्दिक का उपयोग कर

NSMutableArray *strings = [NSMutableArray array]; 
for(int i = 0; i < DESIRED_MAJOR_SIZE; i++) 
{ 
    [strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]]; 
} 

,, आप एक अपरिवर्तनीय संस्करण इस तरह प्राप्त कर सकते हैं

फिर आप इस तरह उपयोग कर सकते हैं:

NSString *s = [[strings objectAtIndex:i] objectAtIndex:j]; 

यह कुछ हद तक प्रारंभ करने में अजीब है, लेकिन यह जाने के लिए आप NSArray तरीकों का उपयोग करना चाहते हैं तो तरीका है।

NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil 

और फिर इसका इस्तेमाल इस तरह::

एक वैकल्पिक सी सरणियों उपयोग करने के लिए है

NSString *s = strings[i][j]; 

यह कम अजीब है, लेकिन आप को बनाए रखने/कॉपीको सावधान रहना होगा और मानों को रिलीज़ करते हैं जैसे आप उन्हें डालते हैं और उन्हें सरणी से हटा देते हैं। (! जब तक आप एआरसी का उपयोग कर रहे ज़ाहिर है,) NSArray आप के लिए, लेकिन वह सी शैली सरणियों के साथ ऐसा होता है, तो आप एक सरणी को बदलने के लिए कुछ इस तरह करने की जरूरत है:

[strings[i][j] release]; 
strings[i][j] = [newString retain]; 

अन्य अंतर यह है कि आप है सी-स्टाइल सरणी में शून्य डाल सकते हैं, लेकिन एनएसएआरआरएआरई नहीं - आपको इसके लिए एनएसएनयूएल का उपयोग करने की आवश्यकता है। एनएसएसटींग मेमोरी मैनेजमेंट के बारे में अधिक जानकारी के लिए स्टैक ओवरफ्लो प्रश्न Cocoa: Memory management with NSString पर भी नज़र डालें।

+2

+1। – Abizern

12

आप घोषित करने और तार के एक दो आयामी सरणी को प्रारंभ करना चाहते हैं, तो आप ऐसा कर सकते हैं:

NSArray *myArray = [NSArray arrayWithObjects: 
         [NSArray arrayWithObjects:@"item 1-1", @"item 1-2", nil], 
         [NSArray arrayWithObjects:@"item 2-1", @"item 2-2", nil], 
         [NSArray arrayWithObjects:@"item 3-1", @"item 3-2", nil], 
         [NSArray arrayWithObjects:@"item 4-1", @"item 4-2", nil], 
         nil]; 

यह आपको एक अपरिवर्तनीय सरणी देने को लाभ मिलता है।

+0

हाय स्टीव मैकिलोड, अगर मेरे पास इस तरह मेरा ऐरे है तो मैं "आइटम 1-1" का मूल्य कैसे प्राप्त कर सकता हूं। –

+1

[[myArray objectAtIndex: 1] objectAtIndex: 1] – Hackmodford

2

मैं स्वयं विज्ञापन कर सकता हूं लेकिन मैंने 212 सरणी के रूप में NSMutableArray पर एक आसान रैपर लिखा था। यह गिटहब पर CRL2DArray के रूप में यहां उपलब्ध है। https://github.com/tGilani/CRL2DArray

+0

एंड्रॉइड (जावा) से आ रहा है मुझे आश्चर्य है कि ओबीजे-सी में 2 डी ऐरे बनाने में कितना मुश्किल है, बहुत उपयोगी गिटहब सर के लिए धन्यवाद! –

+0

एकमात्र समस्या यह है कि मेरी इच्छा है कि अधिक अंतर्निहित विधियां हों जो एक सामान्य एनएसएआरएआरई की तरह गिनती है, लेकिन अब के लिए मैं इसे मैन्युअल रूप से करूँगा! –

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