Objective-C Language
NSArray
수색…
통사론
- NSArray * 단어; // 불변의 배열을 선언한다.
- NSMutableArray * 단어; // 변경 가능한 배열 선언
- 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:...]
단일 항목 가져 오기
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];
사용자 정의 객체로 배열 정렬
메소드 비교
당신은 당신의 객체를위한 compare-method를 구현한다 :
- (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를 사용 NSSortDescriptor
때문에 NSSortDescriptor
를 사용하는 것보다 -compare:
및 블록 기반 메서드는 일반적으로 훨씬 빠릅니다. 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);
}];
배열 비교
두 배열의 요소 수가 같고 모든 쌍이 isEqual : 비교를 통과하면 YES 를 반환하는 적절한 isEqualToArray : 메서드로 배열을 비교할 수 있습니다.
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]];
이 방법은 일반적으로 원래 배열을 파괴하거나 더 많은 메모리를 할당 할 필요없이 새 배열을 매우 효율적으로 다시 만들도록 최적화되어 있습니다.