IOS में पूर्णांकों की एक सरणी बनाना


98

यदि आप पूर्णांक की एक सरणी बनाना चाहते हैं, तो क्या आप NSInteger का उपयोग कर सकते हैं? क्या आपको NSNumber का उपयोग करना है? यदि ऐसा है, तो क्यों?


आप अपने सरणी पूर्णांक के साथ क्या करना चाहते हैं?
ड्रीमलैक्स

निश्चित नहीं। मैंने अभी कहीं सुना है कि आपको सरणियों के लिए NSNumber का उपयोग करना है और इसलिए मैं इस बारे में सोच रहा था।
न्यूरोमैंसर

जवाबों:


159

आप एक सादे पुराने सी सरणी का उपयोग कर सकते हैं:

NSInteger myIntegers[40];

for (NSInteger i = 0; i < 40; i++)
    myIntegers[i] = i;

// to get one of them
NSLog (@"The 4th integer is: %d", myIntegers[3]);

या, यदि आप एक का उपयोग कर सकते NSArrayया NSMutableArray, लेकिन यहाँ आप एक अंदर प्रत्येक पूर्णांक लपेट के लिए की आवश्यकता होगी NSNumber(क्योंकि उदाहरण NSArrayवस्तुओं पकड़ वर्ग उदाहरणों को तैयार कर रहे हैं)।

NSMutableArray *myIntegers = [NSMutableArray array];

for (NSInteger i = 0; i < 40; i++)
    [myIntegers addObject:[NSNumber numberWithInteger:i]];

// to get one of them
NSLog (@"The 4th integer is: %@", [myIntegers objectAtIndex:3]);

// or
NSLog (@"The 4th integer is: %d", [[myIntegers objectAtIndex:3] integerValue]);

9
मुझे लगता है कि यह ध्यान देने योग्य है कि सी सरणियां किसी भी चीज के लिए इतनी परेशानी हैं, लेकिन तुच्छ उपयोग, यह वास्तव में किसी भी सरणियों को लपेटने के लिए कम परेशानी है जिसे आप एनएसएएनआरएस के एनएसएआर के रूप में रखने की योजना बनाते हैं।
चक

2
हाँ, और दी गई [संभवतः] विशेषज्ञ-स्तरीय आशाओं के हुड के तहत NSArray, मुझे यकीन है कि आप प्रदर्शन हिट महसूस नहीं करेंगे।
ड्रीमलैक्स

@dreamlax मुझे आश्चर्य है कि NSArray के हुड के तहत किस प्रकार के विशेषज्ञ-स्तरीय अनुकूलन है? स्मार्ट मेमोरी आवंटन जो सीमा को हिट करने के बाद संभवतया आवंटित मेमोरी के आकार को दोगुना कर देता है?
:)

2
@Andy: CFArray के लिए वास्तविक स्रोत पर एक नज़र डालें यहाँ और मानक की जाँच यहां । शुरू में आपको लगता है कि यह थोड़ा चालाक है।
ड्रीमलैक्स

यह मानते हुए कि इस सरणी को केवल एक विधि के भीतर उपयोग किया जाता है, NSIntegers के C सरणी का उपयोग करने के साथ कोई समस्या नहीं है? बस दोहरी जाँच ...
Dan Rosenstark

58

सी सरणी:

NSInteger array[6] = {1, 2, 3, 4, 5, 6};

उद्देश्य-सी सरणी:

NSArray *array = @[@1, @2, @3, @4, @5, @6];
// numeric values must in that case be wrapped into NSNumbers

स्विफ्ट एरे:

var array = [1, 2, 3, 4, 5, 6]

यह सही भी है:

var array = Array(1...10)

नायब: स्विफ्ट में सरणियों को दृढ़ता से टाइप किया जाता है; उस स्थिति में, संकलक उस सामग्री से प्रभावित होता है जो सरणी पूर्णांक का एक सरणी है। आप इस स्पष्ट प्रकार सिंटैक्स का उपयोग कर सकते हैं:

var array: [Int] = [1, 2, 3, 4, 5, 6]

यदि आप डबल्स की एक सरणी चाहते हैं, तो आप उपयोग करेंगे:

var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference

या:

var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type

1
नकारात्मक पूर्णांक के लिए समतुल्य "@number" सिंटैक्स क्या होगा?
ज़ोफिल

5

यदि आप NSArray का उपयोग करना चाहते हैं, तो आपको इसमें डालने के लिए एक Objective-C क्लास की आवश्यकता है - इसलिए NSNumber आवश्यकता है।

उस ने कहा, ओब्ज-सी अभी भी सी है, इसलिए यदि आप की जरूरत है, तो आप नियमित सी सरणियों का उपयोग कर सकते हैं और एनएसएनटल के बजाय नियमित रूप से इनलेट पकड़ सकते हैं।


4

आप NSArray के बजाय CFArray का उपयोग कर सकते हैं । यहाँ एक लेख बताया गया है कि कैसे।

CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
  CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */

यही बात अन्य कंटेनरों के CoreFoundation संस्करण के लिए भी लागू होती है।


3
यदि NSArray पर CFArray का उपयोग करने का कोई फायदा है, तो मैं इसे नहीं देखता। एक NSArray हुड के तहत एक CFArray है; यह सिर्फ यह कठिन तरीका है।
डेविड गिश

1
@ क्रिप्टोकरंसी यहाँ एक छोटा सा अंतर है, CFArray कुछ भी बनाए या जारी नहीं करेगा क्योंकि यह बिना कॉलबैक के बनाया गया था। मैं हालांकि सहमत हूँ, वहाँ कोई फायदा नहीं लगता है।
ड्रीमलैक्स

4

मैंने अच्छे पुराने सी एरे के इर्द-गिर्द एक साधारण वस्तुनिष्ठ सी आवरण बनाया है जिसका उपयोग अधिक आसानी से किया जा सकता है: https://gist.github.com/.com/70703333


3

यदि आपके पूर्णांकों के क्रम की आवश्यकता नहीं है, और यदि केवल विशिष्ट मूल्य हैं

आप NSIndexSet या NSMutableIndexSet का भी उपयोग कर सकते हैं आप आसानी से पूर्णांक जोड़ने या निकालने में सक्षम होंगे, या जांचें कि आपके सरणी में पूर्णांक है या नहीं

- (void)addIndex:(NSUInteger)index
- (void)removeIndex:(NSUInteger)index
- (BOOL)containsIndexes:(NSIndexSet *)indexSet

अधिक जानकारी के लिए प्रलेखन की जाँच करें ।


2
यह एक भयानक विचार है। यहां Apple के दस्तावेज़ का एक टुकड़ा है: आपको पूर्णांक मानों के मनमाने संग्रह को संग्रहीत करने के लिए अनुक्रमणिका सेट का उपयोग नहीं करना चाहिए क्योंकि अनुक्रमणिका क्रमबद्ध अनुक्रमित को श्रेणीबद्ध करता है। यह उन्हें अलग-अलग पूर्णांकों के संग्रह से अधिक कुशल बनाता है। इसका यह भी अर्थ है कि प्रत्येक सूचकांक मूल्य केवल सूचकांक सेट में एक बार दिखाई दे सकता है।
रुडोल्फ एडमकोविक्स

1
मैं सहमत हूं और यही कारण है कि मैंने अपना जवाब एक चेतावनी के साथ दिया। हालांकि, मैं कुछ लोगों को जानता हूं जिन्होंने पूर्णांक सरणियों के बारे में यह प्रश्न पूछा है, और वास्तव में एक सूचकांक सेट की आवश्यकता है। इसलिए मैंने इसका वैकल्पिक उत्तर दिया।
didier_v_

केवल एक नियमित NSSet(और पूर्णांक का उपयोग करके NSNumber) में क्या गलत है ?
ड्रीमलैक्स

@dreamlax ओवरहेड, लेकिन आम तौर पर, ऐसे सवाल पूछने वाले लोग C को संभाल नहीं सकते हैं और उनके पास स्टोर करने के लिए बस कुछ संख्याएं हैं, इसलिए NSArray या NSSet सबसे अच्छा होना चाहिए।
बेन सिंक्लेयर

2

मुझे लगता है कि NSNumbers का उपयोग करना बहुत आसान है। यह सब आपको करना चाहिए:

NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];

लेकिन क्या होगा अगर आपके सरणी में 10 या 100 नंबर हैं?
हेंसन

1
आप forसंख्याओं के लिए या केवल एक और सरणी का उपयोग कर सकते हैं , और फिर arrayWithArray
नेकू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.