Objective-C Language
NSArray
Szukaj…
Składnia
- NSArray * words; // Deklaracja niezmiennej tablicy
- NSMutableArray * słowa; // Deklaracja zmiennej tablicy
- NSArray * words = [NSArray arrayWithObjects: @ „one”, @ „two”, zero]; // Składnia inicjalizacji tablicy
- NSArray * words = @ [@ "list", @ "of", @ "words", @ 123, @ 3.14]; // Deklarowanie literałów tablicowych
- NSArray * stringArray = [NSArray arrayWithObjects: [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], zero]; // Tworzenie tablic wielowymiarowych
Tworzenie tablic
Tworzenie niezmiennych tablic:
NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];
// Using the array literal syntax:
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
Zmienne tablice, patrz NSMutableArray .
Sprawdzanie liczby elementów w tablicy
NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];
NSLog (@"Number of elements in array = %lu", [myColors count]);
Dostęp do elementów
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
// Preceding is the preferred equivalent to [NSArray arrayWithObjects:...]
Zdobycie jednego przedmiotu
Metoda objectAtIndex:
zapewnia pojedynczy obiekt. Pierwszy obiekt w NSArray
ma indeks 0. Ponieważ NSArray
może być jednorodna (zawiera różne typy obiektów), zwracanym typem jest id
(„dowolny obiekt”). ( id
można przypisać do zmiennej dowolnego innego typu obiektu.) Co ważne, NSArray
może zawierać tylko obiekty. Nie mogą zawierać wartości takich jak int
.
NSUInteger idx = 2;
NSString *color = [myColors objectAtIndex:idx];
// color now points to the string @"Green"
Clang zapewnia lepszą składnię indeksu dolnego w ramach funkcji literałów tablicowych :
NSString *color = myColors[idx];
Oba z nich zgłaszają wyjątek, jeśli przekazany indeks jest mniejszy niż 0 lub większy niż count - 1
.
Pierwszy i ostatni przedmiot
NSString *firstColor = myColors.firstObject;
NSString *lastColor = myColors.lastObject;
firstObject
i lastObject
są obliczonymi właściwościami i zwracają nil
zamiast awarii w przypadku pustych tablic. W przypadku tablic jednoelementowych zwracają ten sam obiekt. Chociaż metoda firstObject
nie została wprowadzona do NSArray
do iOS 4.0.
NSArray *empty = @[]
id notAnObject = empty.firstObject; // Returns `nil`
id kaboom = empty[0]; // Crashes; index out of bounds
Filtrowanie tablic z predykatami
NSArray *array = [NSArray arrayWithObjects:@"Nick", @"Ben", @"Adam", @"Melissa", nil];
NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] 'a'"];
NSArray *beginWithA = [array filteredArrayUsingPredicate:bPredicate];
// beginWithA contains { @"Adam" }.
NSPredicate *ePredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'e'"];
[array filterUsingPredicate:ePredicate];
// array now contains { @"Ben", @"Melissa" }
Więcej o
Dokument Apple: NSPredicate
Konwertowanie NSArray na NSMutableArray w celu umożliwienia modyfikacji
NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];
// Convert myColors to mutable
NSMutableArray *myColorsMutable = [myColors mutableCopy];
Sortowanie tablicy z niestandardowymi obiektami
Porównaj metodę
Zaimplementuj metodę porównawczą dla swojego obiektu:
- (NSComparisonResult)compare:(Person *)otherObject {
return [self.birthDate compare:otherObject.birthDate];
}
NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(compare:)];
NSSortDescriptor
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [drinkDetails sortedArrayUsingDescriptors:sortDescriptors];
Możesz łatwo sortować według wielu kluczy, dodając więcej niż jeden do tablicy. Możliwe jest również użycie niestandardowych metod porównawczych. Zajrzyj do dokumentacji .
Bloki
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Występ
Metody -compare:
i oparte na blokach będą ogólnie znacznie szybsze niż używanie NSSortDescriptor
ponieważ ten ostatni opiera się na KVC. Podstawową zaletą metody NSSortDescriptor
jest to, że zapewnia ona sposób definiowania kolejności sortowania przy użyciu danych, a nie kodu, co ułatwia np. Konfigurację, aby użytkownicy mogli posortować NSTableView
, klikając wiersz nagłówka.
Konwersja między zestawami a tablicami
NSSet *set = [NSSet set];
NSArray *array = [NSArray array];
NSArray *fromSet = [set allObjects];
NSSet *fromArray = [NSSet setWithArray:array];
Odwróć tablicę
NSArray *reversedArray = [myArray.reverseObjectEnumerator allObjects];
Pętla
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
// Fast enumeration
// myColors cannot be modified inside the loop
for (NSString *color in myColors) {
NSLog(@"Element %@", color);
}
// Using indices
for (NSUInteger i = 0; i < myColors.count; i++) {
NSLog(@"Element %d = %@", i, myColors[i]);
}
// Using block enumeration
[myColors enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL * stop) {
NSLog(@"Element %d = %@", idx, obj);
// To abort use:
*stop = YES
}];
// Using block enumeration with options
[myColors enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL * stop) {
NSLog(@"Element %d = %@", idx, obj);
}];
Korzystanie z generycznych
Dla zwiększenia bezpieczeństwa możemy zdefiniować typ obiektu, który zawiera tablica:
NSArray<NSString *> *colors = @[@"Red", @"Green", @"Blue", @"Yellow"];
NSMutableArray<NSString *> *myColors = [NSMutableArray arrayWithArray:colors];
[myColors addObject:@"Orange"]; // OK
[myColors addObject:[UIColor purpleColor]]; // "Incompatible pointer type" warning
Należy zauważyć, że jest to sprawdzane tylko podczas kompilacji.
Wyliczanie za pomocą bloków
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
[myColors enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"enumerating object %@ at index %lu", obj, idx);
}];
Ustawiając parametr stop
na YES
, możesz wskazać, że dalsze wyliczanie nie jest potrzebne. aby to zrobić, po prostu ustaw &stop = YES
.
NSEnumerationOptions
Możesz wyliczyć tablicę w odwrotnej kolejności i / lub jednocześnie:
[myColors enumerateObjectsWithOptions:NSEnumerationConcurrent | NSEnumerationReverse
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"enumerating object %@ at index %lu", obj, idx);
}];
Wyliczanie podzbioru tablicy
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 1)];
[myColors enumerateObjectsAtIndexes:indexSet
options:kNilOptions
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"enumerating object %@ at index %lu", obj, idx);
}];
Porównywanie tablic
Tablice można porównać pod kątem równości z trafnie nazwaną metodą isEqualToArray: metoda, która zwraca TAK, gdy obie tablice mają tę samą liczbę elementów i każda para przechodzi przez isEqual: porównanie.
NSArray *germanMakes = @[@"Mercedes-Benz", @"BMW", @"Porsche",
@"Opel", @"Volkswagen", @"Audi"];
NSArray *sameGermanMakes = [NSArray arrayWithObjects:@"Mercedes-Benz",
@"BMW", @"Porsche", @"Opel",
@"Volkswagen", @"Audi", nil];
if ([germanMakes isEqualToArray:sameGermanMakes]) {
NSLog(@"Oh good, literal arrays are the same as NSArrays");
}
Ważne jest to, że każda para musi przejść test isEqual: test. W przypadku obiektów niestandardowych metoda ta powinna zostać zaimplementowana i istnieje w protokole NSObject.
Dodaj obiekty do NSArray
NSArray *a = @[@1];
a = [a arrayByAddingObject:@2];
a = [a arrayByAddingObjectsFromArray:@[@3, @4, @5]];
Metody te są zoptymalizowane pod kątem bardzo wydajnego odtwarzania nowej tablicy, zwykle bez konieczności niszczenia oryginalnej tablicy lub nawet przydzielania większej ilości pamięci.