Objective-C Language
NSArray
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
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.