İOS'ta bir dizi tam sayı oluşturma


99

Bir tamsayı dizisi yapmak istiyorsanız, NSInteger kullanabilir misiniz? NSNumber kullanmak zorunda mısınız? Öyleyse neden?

Yanıtlar:


159

Eski, düz bir C dizisi kullanabilirsiniz:

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

Veya bir NSArrayveya kullanabilirsiniz NSMutableArray, ancak burada bir NSNumberörnek içindeki her tamsayıyı sarmalamanız gerekir (çünkü NSArraynesneler sınıf örneklerini tutacak şekilde tasarlanmıştır).

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
Bence C dizileri, önemsiz, tek seferlik kullanım dışında her şey için o kadar güçlük çekiyor ki, etrafta tutmayı planladığınız dizileri NSArrays of NSNumber olarak sarmanın aslında daha az sorun olduğunu.
Chuck

2
Evet, ve [muhtemelen] uzman düzeyindeki optimizasyonlar göz önüne alındığında, NSArrayeminim performansın çarptığını hissetmeyeceksiniz.
dreamlax

@dreamlax NSArray başlığı altında ne tür uzman düzeyinde optimizasyon olduğunu merak ediyorum? Sınıra ulaştığında ayrılmış belleğin boyutunu muhtemelen iki katına çıkaran akıllı bellek ayırma?
Ben Sinclair

2
@Andy: CFArray gerçek kaynağında göz burada ve kriterler göz atın burada . Başlangıçta düşündüğünüzden biraz daha akıllı.
dreamlax

Bu dizinin sadece bir yöntem içinde kullanıldığını varsayarsak, bir C dizisi NSInteger kullanmanın bir sorunu yok mu? Sadece iki kez kontrol edin ...
Dan Rosenstark

58

C dizisi:

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

Objective-C Dizisi:

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

Swift Dizisi:

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

Bu da doğrudur:

var array = Array(1...10)

Not: diziler Swift'de güçlü bir şekilde yazılmıştır; bu durumda, derleyici, dizinin bir tamsayı dizisi olduğunu içerikten çıkarır. Bu açık tür sözdizimini de kullanabilirsiniz:

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

Bir dizi Çift istiyorsanız, şunu kullanırsınız:

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

veya:

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

1
Negatif bir tamsayı için eşdeğer "@ sayı" sözdizimi ne olur?
Ziofil

5

Bir NSArray kullanmak istiyorsanız, içine koymak için bir Objective-C sınıfına ihtiyacınız vardır - dolayısıyla NSNumber gereksinimi.

Bununla birlikte, Obj-C hala C'dir, bu nedenle normal C dizilerini kullanabilir ve gerekirse NSNumber yerine normal girişleri tutabilirsiniz.


5

NSArray yerine CFArray kullanabilirsiniz . İşte nasıl yapılacağını açıklayan bir makale.

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

Aynısı diğer kapsayıcıların CoreFoundation sürümü için de geçerlidir.


3
NSArray yerine CFArray kullanmanın bir avantajı varsa, görmüyorum. NSArray, kaputun altındaki bir CFArray'dir; bu sadece zor yoldan yapmaktır.
David Gish

1
@Cryptognome Burada küçük bir fark var, CFArray geri çağırmalar olmadan yaratıldığı için hiçbir şeyi tutmayacak veya bırakmayacak. Yine de katılıyorum, herhangi bir avantajı yok gibi görünüyor.
dreamlax


3

Tam sayılarınızın sırası gerekli değilse ve yalnızca benzersiz değerler varsa

NSIndexSet veya NSMutableIndexSet'i de kullanabilirsiniz Tam sayıları kolayca ekleyip kaldırabilir veya dizinizin bir tamsayı içerip içermediğini kontrol edebilirsiniz.

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

Daha fazla bilgi için belgelere bakın.


2
Bu berbat bir fikir. İşte Apple'ın belgelerinden bir parça: Rasgele bir tamsayı değerleri koleksiyonunu saklamak için dizin kümelerini kullanmamalısınız çünkü dizin kümeleri dizinleri sıralı aralıklar olarak saklar. Bu, onları ayrı tam sayılardan oluşan bir koleksiyon depolamaktan daha verimli kılar. Bu ayrıca, her bir dizin değerinin dizin kümesinde yalnızca bir kez görünebileceği anlamına gelir.
Rudolf Adamkovič 01

1
Katılıyorum ve bu yüzden yanıtıma bir uyarı ile başladım. Bununla birlikte, tamsayı dizileri hakkında bu soruyu soran ve aslında bir dizin kümesine ihtiyaç duyan bazı insanlar tanıyorum. Bu yüzden bu alternatif cevabı verdim.
didier_v_

Sadece normalin NSSet(ve bir içine sarılmış tamsayıların kullanılması) nesi yanlış NSNumber?
dreamlax

@dreamlax ek yükü, ancak genel olarak konuşursak, bu tür soruları soran insanlar C'yi kaldıramazlar ve saklayacakları birkaç numara vardır, bu nedenle NSArray veya NSSet en iyisi olmalıdır.
Ben Sinclair

2

NSNumbers kullanmanın çok daha kolay olduğunu düşünüyorum. Tek yapmanız gereken bu:

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

ama dizinizde 10 veya 100 sayı varsa ne olur?
Henson

1
forSayılar için veya sadece başka bir dizi kullanabilirsiniz ve sonra arrayWithArray.
Neeku
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.