Jeśli chcesz utworzyć tablicę liczb całkowitych, czy możesz użyć NSInteger? Czy musisz używać numeru NSNumber? Jeśli tak, to dlaczego?
Jeśli chcesz utworzyć tablicę liczb całkowitych, czy możesz użyć NSInteger? Czy musisz używać numeru NSNumber? Jeśli tak, to dlaczego?
Odpowiedzi:
Możesz użyć zwykłej starej tablicy C:
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]);
Lub możesz użyć NSArray
lub NSMutableArray
, ale tutaj będziesz musiał zawinąć każdą liczbę całkowitą wewnątrz NSNumber
instancji (ponieważ NSArray
obiekty są zaprojektowane do przechowywania instancji klas).
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
, jestem pewien, że nie poczujesz uderzenia w wydajność.
Tablica C:
NSInteger array[6] = {1, 2, 3, 4, 5, 6};
Tablica 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]
To też jest poprawne:
var array = Array(1...10)
Uwaga: tablice są silnie wpisywane w języku Swift; w takim przypadku kompilator wnioskuje z treści, że tablica jest tablicą liczb całkowitych. Możesz też użyć tej jawnej składni:
var array: [Int] = [1, 2, 3, 4, 5, 6]
Gdybyś chciał mieć tablicę Doubles, użyłbyś:
var array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] // implicit type-inference
lub:
var array: [Double] = [1, 2, 3, 4, 5, 6] // explicit type
Jeśli chcesz używać NSArray, potrzebujesz klasy Objective-C, aby w nim umieścić - stąd wymóg NSNumber.
To powiedziawszy, Obj-C nadal jest C, więc możesz używać zwykłych tablic C i przechowywać zwykłe liczby int zamiast NSNumbers, jeśli chcesz.
Możesz użyć CFArray zamiast NSArray . Oto artykuł wyjaśniający, jak to zrobić.
CFMutableArrayRef ar = CFArrayCreateMutable(NULL, 0, NULL);
for (NSUInteger i = 0; i < 1000; i++)
{
CFArrayAppendValue(ar, (void*)i);
}
CFRelease(ar); /* Releasing the array */
To samo dotyczy wersji CoreFoundation innych kontenerów.
Stworzyłem proste opakowanie Objective C wokół starej dobrej tablicy C, aby można było z niej wygodniej korzystać: https://gist.github.com/4705733
Jeśli kolejność liczb całkowitych nie jest wymagana i jeśli istnieją tylko unikalne wartości
możesz także użyć NSIndexSet lub NSMutableIndexSet Będziesz mógł łatwo dodawać i usuwać liczby całkowite lub sprawdzić, czy twoja tablica zawiera liczbę całkowitą z
- (void)addIndex:(NSUInteger)index
- (void)removeIndex:(NSUInteger)index
- (BOOL)containsIndexes:(NSIndexSet *)indexSet
Sprawdź dokumentację, aby uzyskać więcej informacji.
NSSet
(i używaniu liczb całkowitych zapakowanych w NSNumber
)?
Myślę, że o wiele łatwiej jest używać numerów NS. To wszystko, co musisz zrobić:
NSNumber *myNum1 = [NSNumber numberWithInt:myNsIntValue1];
NSNumber *myNum2 = [NSNumber numberWithInt:myNsIntValue2];
.
.
.
NSArray *myArray = [NSArray arrayWithObjects: myNum1, myNum2, ..., nil];
for
lub po prostu innej tablicy dla liczb, a następnie arrayWithArray
.