Objective-C Language
NSArray
Sök…
Syntax
- NSArray * ord; // Förklara obrukbar matris
- NSMutableArray * ord; // Förklara muterbar matris
- NSArray * word = [NSArray arrayWithObjects: @ "en", @ "två", nil]; // Syntax för arrayinitialisering
- NSArray * ord = @ [@ "lista", @ "av", @ "ord", @ 123, @ 3.14]; // Deklarera matrisbokstäver
- NSArray * stringArray = [NSArray arrayWithObjects: [NSMutableArray array], [NSMutableArray array], [NSMutableArray array], nil]; // Skapa multidimensionella matriser
Skapa matriser
Skapa oföränderliga matriser:
NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];
// Using the array literal syntax:
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
För muterbara matriser, se NSMutableArray .
Ta reda på antalet element i en matris
NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];
NSLog (@"Number of elements in array = %lu", [myColors count]);
Åtkomst till element
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
// Preceding is the preferred equivalent to [NSArray arrayWithObjects:...]
Få en enda artikel
objectAtIndex:
ger ett enda objekt. Det första objektet i en NSArray
är index 0. Eftersom en NSArray
kan vara homogen (innehålla olika typer av objekt) är id
("valfritt objekt"). (En id
kan tilldelas en variabel av vilken annan objekttyp som helst.) Viktigt att NSArray
s kan bara innehålla objekt. De kan inte innehålla värden som int
.
NSUInteger idx = 2;
NSString *color = [myColors objectAtIndex:idx];
// color now points to the string @"Green"
Clang tillhandahåller en bättre prenumerationssyntax som en del av dess array-bokstavsfunktioner :
NSString *color = myColors[idx];
Båda dessa kastar ett undantag om det godkända indexet är mindre än 0 eller högre än count - 1
.
Första och sista artikeln
NSString *firstColor = myColors.firstObject;
NSString *lastColor = myColors.lastObject;
firstObject
och lastObject
är beräknade egenskaper och returnerar nil
istället för att krascha för tomma matriser. För matriser med enstaka element returnerar de samma objekt. Den firstObject
metoden introducerades dock inte till NSArray
förrän iOS 4.0.
NSArray *empty = @[]
id notAnObject = empty.firstObject; // Returns `nil`
id kaboom = empty[0]; // Crashes; index out of bounds
Filtrera matriser med predikat
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" }
Mer om
Apple doc: NSPredicate
Konvertera NSArray till NSMutableArray för att tillåta modifiering
NSArray *myColors = [NSArray arrayWithObjects: @"Red", @"Green", @"Blue", @"Yellow", nil];
// Convert myColors to mutable
NSMutableArray *myColorsMutable = [myColors mutableCopy];
Sorteringsfält med anpassade objekt
Jämför metod
Antingen implementerar du en jämför-metod för ditt 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];
Du kan enkelt sortera efter flera tangenter genom att lägga till mer än en i matrisen. Det är också möjligt att använda anpassade komparatormetoder. Titta på dokumentationen .
Blocks
NSArray *sortedArray;
sortedArray = [drinkDetails sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *first = [(Person*)a birthDate];
NSDate *second = [(Person*)b birthDate];
return [first compare:second];
}];
Prestanda
-compare:
och -compare:
metoder kommer i allmänhet att vara ganska lite snabbare än att använda NSSortDescriptor
eftersom den senare förlitar sig på KVC. Den främsta fördelen med NSSortDescriptor
metoden är att det ger ett sätt att definiera din sorteringsordning med hjälp av data, snarare än kod, vilket gör det enkelt att t.ex. ställa in saker så att användare kan sortera en NSTableView
genom att klicka på rubrikraden.
Konvertering mellan uppsättningar och matriser
NSSet *set = [NSSet set];
NSArray *array = [NSArray array];
NSArray *fromSet = [set allObjects];
NSSet *fromArray = [NSSet setWithArray:array];
Omvänd en array
NSArray *reversedArray = [myArray.reverseObjectEnumerator allObjects];
Looper igenom
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);
}];
Använda Generics
För ökad säkerhet kan vi definiera vilken typ av objekt som arrayen innehåller:
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
Det bör noteras att detta endast kontrolleras under sammanställningstiden.
Räknar upp med block
NSArray *myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];
[myColors enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"enumerating object %@ at index %lu", obj, idx);
}];
Genom att sätta stop
parametern YES
kan du ange att ytterligare uppräkning inte behövs. för att göra detta ställer du bara in &stop = YES
.
NSEnumerationOptions
Du kan räkna upp matrisen i omvänd och / eller samtidigt:
[myColors enumerateObjectsWithOptions:NSEnumerationConcurrent | NSEnumerationReverse
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"enumerating object %@ at index %lu", obj, idx);
}];
Räknar upp delmängden av array
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);
}];
Jämför matriser
Arrays kan jämföras för jämlikhet med den lämpligt namngivna isEqualToArray: metoden, som returnerar JA när båda arrayerna har samma antal element och varje par passerar en isEqual: jämförelse.
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");
}
Det viktiga är att varje par måste klara isEqual: testet. För anpassade objekt bör denna metod implementeras. Den finns i NSObject-protokollet.
Lägg till objekt i NSArray
NSArray *a = @[@1];
a = [a arrayByAddingObject:@2];
a = [a arrayByAddingObjectsFromArray:@[@3, @4, @5]];
Dessa metoder är optimerade för att återskapa den nya matrisen mycket effektivt, vanligtvis utan att behöva förstöra den ursprungliga matrisen eller till och med tilldela mer minne.