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

NSPredicate :

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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow