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

NSPredicate :

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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow