サーチ…


構文

  • NSArray * words; //不変な配列を宣言する
  • NSMutableArray * words; //可変配列を宣言する
  • NSArray * words = [NSArray arrayWithObjects:@ "one"、@ "two"、nil]; //配列の初期化構文
  • NSArray * words = @ [@ "リスト"、 "@" "@"単語 "、@ 123、@ 3.14]; //配列リテラルを宣言する
  • NSArray * stringArray = [NSArray arrayWithObjects:[NSMutableArray配列]、[NSMutableArray配列]、[NSMutableArray配列]、nil]; //多次元配列を作成する

配列の作成

不変配列の作成:

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

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

可変配列については、 NSMutableArrayを参照してください。

配列内の要素の数を調べる

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

要素へのアクセス

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

1つのアイテムを取得する

objectAtIndex:メソッドは、単一のオブジェクトを提供します。最初のオブジェクトNSArrayインデックス0であるためNSArray均質であることができる、戻り型がある(異なるタイプのオブジェクトを保持する) id (「任意のオブジェクトを」)。 ( idは、他のオブジェクト型の変数に割り当てることができます)。重要なことに、 NSArrayはオブジェクトしか含めることができません。 intような値を含むことはできません。

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

Clangは配列リテラル機能の一環として 、より良い添字構文提供します

NSString *color = myColors[idx];

渡されたインデックスが0より小さいか、またはcount - 1より大きい場合、これらの両方が例外をスローします。

最初と最後のアイテム

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

firstObjectlastObjectは空の配列ではなく、計算されたプロパティであり、 nilを返します。単一要素配列の場合、同じオブジェクトを返します。ただし、iOS 4.0まではfirstObjectメソッドがNSArray導入されていませんでした。

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

述語を含む配列のフィルタリング

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

もっと詳しく

NSPredicate

Apple doc: NSPredicate

NSArrayをNSMutableArrayに変換して変更できるようにする

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

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

カスタムオブジェクトによる配列の並べ替え

比較方法

あなたのオブジェクトの比較メソッドを実装するか、

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

配列に複数のキーを追加することで、複数のキーで簡単にソートできます。カスタムコンパイラーメソッドの使用も可能です。 ドキュメントを見てください。

ブロック

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

パフォーマンス

後者はKVCに依存しているため、 -compare:とブロックベースのメソッドはNSSortDescriptorを使用するよりもかなり高速になります。 NSSortDescriptorメソッドの主な利点は、コードではなくデータを使用してソート順を定義する方法を提供することで、ヘッダー行をクリックしてNSTableViewをソートできるように設定することが容易になります。

セットと配列の変換

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

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

配列を逆転する

NSArray *reversedArray = [myArray.reverseObjectEnumerator allObjects];

ルーピングスルー

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

ジェネリックスの使用

安全性を高めるために、配列に含まれるオブジェクトのタイプを定義することができます。

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

これは、コンパイル時にのみチェックされることに注意してください。

ブロックを使用した列挙

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

stopパラメータをYES設定すると、さらに列挙する必要がないことを示すことができます。これを行うには単純に&stop = YES設定します。

NSEnumerationOptions
逆および/または同時に配列を列挙することができます:

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

配列のサブセットの列挙

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

配列の比較

配列は、等しく名前がつけられたisEqualToArray:メソッドと比較され、両方の配列が同じ数の要素を持ち、すべてのペアがisEqual:を渡すとYESを返します。

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

重要なことは、すべてのペアがisEqual:testをパスしなければならないことです。カスタムオブジェクトの場合、このメソッドは実装する必要があります。これはNSObjectプロトコルに存在します。

NSArrayにオブジェクトを追加する

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

これらのメソッドは、通常、元の配列を破棄したり、さらに多くのメモリを割り当てることなく、新しい配列を非常に効率的に再作成するように最適化されています。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow