Se você quiser fazer uma matriz de inteiros, pode usar NSInteger? Você tem que usar NSNumber? Se sim, então por quê?
Se você quiser fazer uma matriz de inteiros, pode usar NSInteger? Você tem que usar NSNumber? Se sim, então por quê?
Respostas:
Você pode usar uma matriz C simples e antiga:
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]);
Ou você pode usar um NSArrayou NSMutableArray, mas aqui você precisará agrupar cada inteiro dentro de uma NSNumberinstância (porque os NSArrayobjetos são projetados para conter instâncias de classe).
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]);
NSArray, tenho certeza de que você não sentirá o impacto no desempenho.
Matriz C:
NSInteger array[6] = {1, 2, 3, 4, 5, 6};
Matriz Objective-C:
NSArray *array = @[@1, @2, @3, @4, @5, @6];
// numeric values must in that case be wrapped into NSNumbers
Array Swift:
var array = [1, 2, 3, 4, 5, 6]
Isso também está correto:
var array = Array(1...10)
NB: os arrays são fortemente tipados em Swift; nesse caso, o compilador infere do conteúdo que a matriz é uma matriz de inteiros. Você também pode usar esta sintaxe de tipo explícito:
var array: [Int] = [1, 2, 3, 4, 5, 6]
Se você quisesse uma variedade de Doubles, você usaria:
var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference
ou:
var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type
Se você quiser usar um NSArray, precisará de uma classe Objective-C para colocá-lo - daí o requisito NSNumber.
Dito isso, Obj-C ainda é C, então você pode usar arrays C regulares e manter ints regulares em vez de NSNumbers, se necessário.
Você pode usar CFArray em vez de NSArray. Aqui está um artigo explicando como.
CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */
O mesmo se aplica à versão CoreFoundation dos outros contêineres.
Criei um wrapper Objective C simples em torno do bom e velho array C para ser usado de maneira mais conveniente: https://gist.github.com/4705733
Se a ordem dos seus inteiros não for necessária e se houver apenas valores únicos
você também pode usar NSIndexSet ou NSMutableIndexSet Você será capaz de adicionar e remover inteiros facilmente ou verificar se sua matriz contém um inteiro com
- (void)addIndex:(NSUInteger)index
- (void)removeIndex:(NSUInteger)index
- (BOOL)containsIndexes:(NSIndexSet *)indexSet
Verifique a documentação para mais informações.
NSSet(e usar inteiros dentro de um NSNumber)?
Acho que é muito mais fácil usar o NSNumbers. Tudo o que você precisa fazer:
NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];
forou apenas outra matriz para os números e, em seguida arrayWithArray.