수색…


통사론

  • 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;

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

사용자 정의 객체로 배열 정렬

메소드 비교

당신은 당신의 객체를위한 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]];

이 방법은 일반적으로 원래 배열을 파괴하거나 더 많은 메모리를 할당 할 필요없이 새 배열을 매우 효율적으로 다시 만들도록 최적화되어 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow