Suche…


Syntax

  • NSArray * Wörter; // unveränderliches Array deklarieren
  • NSMutableArray * Wörter; // Das veränderbare Array deklarieren
  • NSArray * words = [NSArray arrayWithObjects: @ "Eins", @ "Zwei", Null]; // Array-Initialisierungssyntax
  • NSArray * words = @ [@ "list", @ "of", @ "words", @ 123, @ 3.14]; // Array-Literale deklarieren
  • NSArray * stringArray = [NSArray ArrayWithObjects: [NSMutableArray-Array], [NSMutableArray-Array], [NSMutableArray-Array], nil]; // Erstellen von multidimentionalen Arrays

Arrays erstellen

Erstellen unveränderlicher Arrays:

NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];

// Using the array literal syntax:
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];

Für veränderbare Arrays siehe NSMutableArray .

Ermitteln der Anzahl der Elemente in einem Array

NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];
NSLog (@"Number of elements in array = %lu", [myColors count]);

Zugriff auf Elemente

NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
// Preceding is the preferred equivalent to [NSArray arrayWithObjects:...]

Einen einzelnen Artikel erhalten

Die objectAtIndex: -Methode stellt ein einzelnes Objekt bereit. Das erste Objekt in einem NSArray ist Index 0. Da ein NSArray homogen sein kann (verschiedene NSArray ), ist der Rückgabetyp id ("any object"). (Eine id kann einer Variablen eines anderen Objekttyps zugewiesen werden.) Wichtig ist, dass NSArray Objekte nur Objekte enthalten können. Sie können keine Werte wie int .

NSUInteger idx = 2;
NSString *color = [myColors objectAtIndex:idx];
// color now points to the string @"Green"

Clang bietet eine bessere Subskriptionssyntax als Teil der Array-Literal-Funktionalität :

NSString *color = myColors[idx];

Beide lösen eine Ausnahme aus, wenn der übergebene Index kleiner als 0 oder größer als count - 1 .

Erster und letzter Artikel

NSString *firstColor = myColors.firstObject;
NSString *lastColor = myColors.lastObject;

firstObject und lastObject sind berechnete Eigenschaften und geben nil anstatt für leere Arrays abstürzen. Bei Einzelelementarrays geben sie dasselbe Objekt zurück. Obwohl die firstObject Methode erst ab iOS 4.0 in NSArray eingeführt wurde.

NSArray *empty = @[]
id notAnObject = empty.firstObject;    // Returns `nil`
id kaboom = empty[0];    // Crashes; index out of bounds

Filtern von Arrays mit Prädikaten

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" }

Mehr über

NSPredicate :

Apple-Dokument: NSPredicate

Konvertieren von NSArray in NSMutableArray, um Änderungen zu ermöglichen

NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];

// Convert myColors to mutable
NSMutableArray *myColorsMutable = [myColors mutableCopy]; 

Array mit benutzerdefinierten Objekten sortieren

Methode vergleichen

Entweder implementieren Sie eine Compare-Methode für Ihr Objekt:

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

Sie können problemlos nach mehreren Schlüsseln sortieren, indem Sie dem Array mehrere hinzufügen. Die Verwendung von benutzerdefinierten Vergleichsmethoden ist ebenfalls möglich. Schauen Sie sich die Dokumentation an .

Blöcke

NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    NSDate *first = [(Person*)a birthDate];
    NSDate *second = [(Person*)b birthDate];
    return [first compare:second];
}];

Performance

Die -compare: und blockbasierte Methoden sind im Allgemeinen etwas schneller als die Verwendung von NSSortDescriptor da letzterer auf KVC angewiesen ist. Der Hauptvorteil der NSSortDescriptor Methode besteht darin, dass die Sortierreihenfolge mithilfe von Daten anstelle von Code definiert werden kann. So können Sie z. B. Dinge einrichten, sodass Benutzer eine NSTableView durch Klicken auf die Kopfzeile sortieren können.

Konvertierung zwischen Sets und Arrays

NSSet *set = [NSSet set];
NSArray *array = [NSArray array];

NSArray *fromSet = [set allObjects];
NSSet *fromArray = [NSSet setWithArray:array];

Ein Array umkehren

NSArray *reversedArray = [myArray.reverseObjectEnumerator allObjects];

Durchlaufen

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

Generics verwenden

Für zusätzliche Sicherheit können wir den Objekttyp definieren, den das Array enthält:

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

Es ist zu beachten, dass dies nur während der Übersetzungszeit überprüft wird.

Aufzählung mit Blöcken

NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
[myColors enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"enumerating object %@ at index %lu", obj, idx);
}];

Wenn Sie den Parameter stop auf YES , können Sie angeben, dass keine weitere Aufzählung erforderlich ist. Dazu setzen Sie einfach &stop = YES .

NSEnumerationOptions
Sie können das Array umgekehrt und / oder gleichzeitig auflisten.

[myColors enumerateObjectsWithOptions:NSEnumerationConcurrent | NSEnumerationReverse
                               usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                                   NSLog(@"enumerating object %@ at index %lu", obj, idx);
                               }];

Aufzählung der Teilmenge des Arrays

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

Arrays vergleichen

Arrays können auf Gleichheit mit der passend benannten isEqualToArray: -Methode verglichen werden, die JA zurückgibt, wenn beide Arrays die gleiche Anzahl von Elementen haben und jedes Paar einen isEqual: Vergleich durchläuft .

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");
}

Wichtig ist, dass jedes Paar den isEqual: Test bestehen muss. Für benutzerdefinierte Objekte sollte diese Methode implementiert werden. Sie ist im NSObject-Protokoll enthalten.

Objekte zu NSArray hinzufügen

NSArray *a = @[@1];
a = [a arrayByAddingObject:@2];
a = [a arrayByAddingObjectsFromArray:@[@3, @4, @5]];

Diese Methoden sind optimiert, um das neue Array sehr effizient neu zu erstellen, normalerweise ohne das ursprüngliche Array zu zerstören oder sogar mehr Speicher zuzuweisen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow