আইওএসে পূর্ণসংখ্যার একটি অ্যারে তৈরি করা


100

আপনি যদি পূর্ণসংখ্যার একটি অ্যারে তৈরি করতে চান, আপনি এনএসআইন্টিজার ব্যবহার করতে পারেন? আপনার কি এনএসবার ব্যবহার করতে হবে? যদি তাই হয় তবে কেন?

উত্তর:


160

আপনি সরল পুরানো সি অ্যারে ব্যবহার করতে পারেন:

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
আমি মনে করি এটি লক্ষণীয় যে সি অ্যারেগুলি তুচ্ছ, এক-বন্ধ ব্যবহার ছাড়া যে কোনও কিছুর জন্য এই জাতীয় ঝামেলা যে আপনি NSNumber এর NSArrays হিসাবে আশেপাশে রাখার পরিকল্পনা করছেন এমন কোনও অ্যারেগুলি আবৃত করতে আসলে এটি কম সমস্যা।
চক

4
হ্যাঁ, এবং [সম্ভবতঃ] বিশেষজ্ঞের স্তরের অপ্টিমাইজেশানগুলি হুডের নীচে দেওয়া হয়েছে NSArray, আমি নিশ্চিত আপনি পারফরম্যান্স হিট অনুভব করবেন না।
ড্রিমলাক্স

@ ড্রিমলাক্স আমি ভাবছি এনএসআরির অধীনে কোন ধরণের বিশেষজ্ঞের স্তরের অপ্টিমাইজেশন হয়? স্মার্ট মেমরি বরাদ্দ যা সীমাবদ্ধতার পরে একবারে বরাদ্দ মেমরির আকার দ্বিগুণ করে? :) পি
প্রোনবার্ড

4
@ অ্যান্ডি: সিএফআরয়ের প্রকৃত উত্সটি এখানে দেখুন এবং মানদণ্ডটি এখানে দেখুন । আপনি প্রথমে যা ভাবেন তার চেয়ে এটি একটু স্মার্ট।
ড্রিমলাক্স

এই অ্যারেটি কেবল একটি পদ্ধতির মধ্যেই ব্যবহৃত হয়েছে বলে ধরে নেওয়া, এনএসআইন্টিজারের সি অ্যারে ব্যবহার করে কোনও সমস্যা নেই? কেবল ডাবল চেকিং ...
ড্যান রোজনস্টার্ক

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)

এনবি: অ্যারেগুলি দৃift়ভাবে সুইফটে টাইপ করা হয়; সেক্ষেত্রে সংকলকটি সামগ্রীটি থেকে অনুমান করে যে অ্যারেটি পূর্ণসংখ্যার অ্যারে। আপনি এই স্পষ্টত ধরণের সিনট্যাক্সটিও ব্যবহার করতে পারেন:

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

4
Aণাত্মক পূর্ণসংখ্যার সমতুল্য "@ সংখ্যা" সিনট্যাক্সটি কী হবে?
জিওফিল

5

আপনি যদি কোনও এনএসআরাই ব্যবহার করতে চান তবে আপনার এটিতে একটি উদ্দেশ্য-সি শ্রেণীর প্রয়োজন - সুতরাং এনএসবার নম্বর প্রয়োজন।

এটি বলেছিল, ওবজ-সি এখনও সি, তাই আপনি নিয়মিত সি অ্যারে ব্যবহার করতে পারেন এবং আপনার প্রয়োজন হলে এনএসএন নাম্বারগুলির পরিবর্তে নিয়মিত ইনটগুলি ধরে রাখতে পারেন।


5

আপনি এনএসআরির পরিবর্তে সিএফআরএ ব্যবহার করতে পারেন । কীভাবে তা ব্যাখ্যা করার জন্য একটি নিবন্ধ এখানে দেওয়া হয়েছে

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

অন্যান্য ধারকগুলির কোরফাউন্ডেশন সংস্করণেও এটি একই প্রযোজ্য।


4
যদি এনএসআরির মাধ্যমে সিএফআরে ব্যবহার করার কোনও সুবিধা থাকে তবে আমি এটি দেখতে পাচ্ছি না। একটি এনএসআরাই হুডের নীচে সিএফএআরআই; এটি কেবল এটি কঠিন উপায়ে করছে।
ডেভিড গিশ

4
@ ক্রাইপটগনোমে এখানে একটি সামান্য পার্থক্য রয়েছে, সিএফআরআই কোনও কিছু ধরে রাখতে বা প্রকাশ করতে পারবে না কারণ এটি কলব্যাক ছাড়াই তৈরি করা হয়েছিল। যদিও আমি একমত, তাতে কোনও লাভ হবে বলে মনে হয় না।
ড্রিমলাক্স

4

আরও সহজলভ্যভাবে ব্যবহার করার জন্য ভাল পুরাতন সি অ্যারের চারপাশে আমি একটি সাধারণ অবজেক্টিভ সি র‍্যাপার তৈরি করেছি: https://gist.github.com/4705733


3

যদি আপনার পূর্ণসংখ্যার ক্রমের প্রয়োজন হয় না এবং যদি কেবল অনন্য মান থাকে

আপনি NSIndexSet বা NSMutableIndexSet ব্যবহার করতে পারেন আপনি সহজেই পূর্ণসংখ্যার যোগ করতে এবং মুছে ফেলতে সক্ষম হবেন বা আপনার অ্যারেতে কোনও পূর্ণসংখ্যা রয়েছে কিনা তা পরীক্ষা করতে পারবেন

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

আরও তথ্যের জন্য ডকুমেন্টেশন চেক করুন ।


4
এটি একটি ভয়ানক ধারণা। অ্যাপলের ডকুমেন্টেশনের একটি অংশ এখানে দেওয়া হয়েছে: পূর্ণসংখ্যার মানগুলির একটি স্বেচ্ছাসেবী সংগ্রহ সংরক্ষণ করার জন্য আপনার সূচি সেটগুলি ব্যবহার করা উচিত নয় কারণ সূচি সূচকগুলি সাজানো রেঞ্জ হিসাবে স্টোর সূচিপত্রগুলি সেট করে। এটি পৃথক পূর্ণসংখ্যার সংগ্রহ সঞ্চয় করার চেয়ে তাদের আরও দক্ষ করে তোলে। এর অর্থ হ'ল প্রতিটি সূচক মান একবারে সূচক সেটে প্রদর্শিত হতে পারে।
রুডল্ফ অ্যাডমকোভিč

4
আমি সম্মত এবং এই কারণেই আমি আমার উত্তরটি একটি সতর্কতা দিয়ে শুরু করেছি। তবে, আমি এমন কিছু লোককে জানি যারা পূর্ণসংখ্যার অ্যারেগুলি সম্পর্কে এই প্রশ্নটি জিজ্ঞাসা করেছিল এবং তাদের আসলে একটি সূচী সেট প্রয়োজন। এজন্য আমি এই বিকল্প উত্তর দিয়েছি।
didier_v_

কেবল একটি নিয়মিত NSSet(এবং একটিতে মোড়ানো পূর্ণসংখ্যার ব্যবহার NSNumber) এর সাথে কী সমস্যা?
ড্রিমলাক্স

ওডহেডড্রিমল্ড, তবে সাধারণভাবে বলতে গেলে, এই জাতীয় প্রশ্ন জিজ্ঞাসা করা লোকেরা সি পরিচালনা করতে পারে না এবং তাদের কেবল সঞ্চয় করার জন্য কয়েকটি সংখ্যা থাকে, সুতরাং এনএসআরাই বা এনএসএসেট অবশ্যই সেরা হতে হবে।
প্রোনবার্ড

2

আমি মনে করি এনএসএন নম্বর ব্যবহার করা অনেক সহজ। আপনার যা করতে হবে তা এই:

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

তবে যদি আপনার অ্যারেতে 10 বা 100 নম্বর থাকে?
হেনসন

4
আপনি forসংখ্যার জন্য বা অন্য কোনও অ্যারে ব্যবহার করতে পারেন এবং তারপরেও arrayWithArray
নেকু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.