Objective-C Language
NSArray
サーチ…
構文
- 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;
firstObject
とlastObject
は空の配列ではなく、計算されたプロパティであり、 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" }
もっと詳しく
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]];
これらのメソッドは、通常、元の配列を破棄したり、さらに多くのメモリを割り当てることなく、新しい配列を非常に効率的に再作成するように最適化されています。