Membuat array bilangan bulat di iOS

98

Jika Anda ingin membuat array bilangan bulat, dapatkah Anda menggunakan NSInteger? Apakah Anda harus menggunakan NSNumber? Jika ya, lalu mengapa?

neuromancer
sumber
Apa yang ingin Anda lakukan dengan array bilangan bulat Anda?
dreamlax
Tidak yakin. Saya baru saja mendengar di suatu tempat bahwa Anda harus menggunakan NSNumber untuk array, jadi saya bertanya-tanya tentang itu.
neuromancer

Jawaban:

159

Anda dapat menggunakan array C lama biasa:

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]);

Atau, Anda dapat menggunakan NSArrayatau NSMutableArray, tetapi di sini Anda perlu menggabungkan setiap bilangan bulat di dalam sebuah NSNumberinstance (karena NSArrayobjek dirancang untuk menampung instance kelas).

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]);
dreamlax
sumber
9
Saya pikir perlu dicatat bahwa array C sangat merepotkan untuk apa pun kecuali penggunaan yang sepele dan satu kali sehingga sebenarnya lebih sedikit masalah untuk membungkus array apa pun yang Anda rencanakan untuk disimpan sebagai NSArays dari NSNumber.
Chuck
2
Ya, dan mengingat [mungkin] pengoptimalan tingkat ahli di bawah tenda NSArray, saya yakin Anda tidak akan merasakan kinerja yang sukses.
dreamlax
@dreamlax Saya ingin tahu jenis pengoptimalan tingkat ahli apa yang ada di bawah tenda NSArray? Alokasi memori pintar yang mungkin hanya menggandakan ukuran memori yang dialokasikan begitu mencapai batas? :) p
Ben Sinclair
2
@Andy: Lihat sumber sebenarnya untuk CFArray di sini dan lihat tolok ukurnya di sini . Ini sedikit lebih pintar dari yang Anda pikirkan pada awalnya.
dreamlax
Dengan asumsi bahwa array ini hanya digunakan dalam suatu metode, tidak ada masalah dengan menggunakan array C dari NSIntegers? Hanya memeriksa dua kali ...
Dan Rosenstark
58

Array C:

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

Larik Objective-C:

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

Swift Array:

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

Ini juga benar:

var array = Array(1...10)

NB: array sangat diketik di Swift; dalam hal ini, kompilator menyimpulkan dari konten bahwa array adalah array bilangan bulat. Anda juga dapat menggunakan sintaks tipe eksplisit ini:

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

Jika Anda menginginkan array Ganda, Anda akan menggunakan:

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

atau:

var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type
Frédéric Adda
sumber
1
Apa yang akan menjadi sintaks "@number" yang setara untuk integer negatif?
Ziofil
5

Jika Anda ingin menggunakan NSArray, Anda memerlukan kelas Objective-C untuk dimasukkan ke dalamnya - karenanya persyaratan NSNumber.

Yang mengatakan, Obj-C masih C, jadi Anda dapat menggunakan array C biasa dan menyimpan int biasa daripada NSNumbers jika perlu.

Dennis Munsie
sumber
4

Anda dapat menggunakan CFArray sebagai pengganti NSArray. Berikut adalah artikel yang menjelaskan caranya.

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

Hal yang sama juga berlaku untuk versi CoreFoundation dari penampung lain.

coyotte508
sumber
3
Jika ada keuntungan menggunakan CFArray dibandingkan NSArray, saya tidak melihatnya. Sebuah NSArray ADALAH CFArray di bawah tenda; ini hanya melakukannya dengan cara yang sulit.
David Gish
1
@Cryptognome ada perbedaan kecil di sini, CFArray tidak akan menyimpan atau melepaskan apa pun karena dibuat tanpa callback. Saya setuju, sepertinya tidak ada keuntungan apapun.
dreamlax
3

Jika urutan bilangan bulat Anda tidak diperlukan, dan jika hanya ada nilai unik

Anda juga dapat menggunakan NSIndexSet atau NSMutableIndexSet Anda akan dapat dengan mudah menambah dan menghapus integer, atau memeriksa apakah array Anda berisi integer dengan

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

Lihat dokumentasi untuk info lebih lanjut.

didier_v_
sumber
2
Itu ide yang buruk. Berikut adalah bagian dari dokumentasi Apple: Anda tidak boleh menggunakan kumpulan indeks untuk menyimpan kumpulan nilai integer yang sewenang-wenang karena kumpulan indeks menyimpan indeks sebagai rentang yang diurutkan. Ini membuatnya lebih efisien daripada menyimpan kumpulan bilangan bulat individual. Ini juga berarti bahwa setiap nilai indeks hanya dapat muncul sekali dalam kumpulan indeks.
Rudolf Adamkovič
1
Saya setuju dan inilah mengapa saya memulai balasan saya dengan sebuah peringatan. Namun, saya tahu beberapa orang yang menanyakan pertanyaan ini tentang array integer, dan sebenarnya membutuhkan kumpulan indeks. Karena itulah saya memberikan jawaban alternatif ini.
didier_v_
Apa yang salah dengan hanya sebuah regular NSSet(dan menggunakan integer yang dibungkus dengan sebuah NSNumber)?
dreamlax
@dreamlax overhead, tetapi secara umum, orang yang menanyakan pertanyaan seperti itu tidak dapat menangani C dan mereka hanya memiliki sedikit nomor untuk disimpan, jadi NSArray atau NSSet harus menjadi yang terbaik.
Ben Sinclair
2

Saya pikir jauh lebih mudah menggunakan NSNumbers. Ini yang perlu Anda lakukan:

NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];
Neeku
sumber
tetapi bagaimana jika array Anda memiliki 10 atau 100 angka?
Henson
1
Anda dapat menggunakan foratau hanya larik lain untuk angka, lalu arrayWithArray.
Neeku