2009-08-30 3 views
1

어떤 유형의 정보가 그러한 열거 형 뒤에 저장됩니까? 예 :어떤 종류의 데이터가 "enum"유형 상수에 있습니까? 어떻게 그것을 NSArray에 추가 할 수 있습니까?

typedef enum { 
    UIViewAnimationCurveEaseInOut, 
    UIViewAnimationCurveEaseIn, 
    UIViewAnimationCurveEaseOut, 
    UIViewAnimationCurveLinear 
} UIViewAnimationCurve; 

안전하게 이러한 열거 형 상수를 배열에 추가 할 수 있는지 확실하지 않습니다. 어떤 생각?

답변

7

열거 형을 목표 - C 정확하게과 동일 열거 형의 각 항목에는 기본적으로 0부터 시작하는 정수 값이 자동으로 지정됩니다.

제공된 예제의 경우 : UIViewAnimationCurveEaseInOut은 0입니다. UIViewAnimationCurveEaseIn은 1이됩니다.

필요한 경우는 열거의 값을 지정할 수 있습니다

:

typedef enum { 
    UIViewAnimationCurveEaseInOut, 
    UIViewAnimationCurveEaseIn = 0, 
    UIViewAnimationCurveEaseOut, 
    UIViewAnimationCurveLinear 
} UIViewAnimationCurve; 

이의이 결과는 다음과 같습니다 UIViewAnimationCurveEaseInOut이 0; UIViewAnimationCurveEaseIn은 0입니다. UIViewAnimationCurveEaseOut는 1입니다. 등등. 그러나 기본적인 목적을 위해 그렇게 할 필요는 없습니다. 장난감으로 유용한 정보를 제공합니다.

위에서 언급했듯이 열거 형은 고유 값으로 간주 할 수 없습니다. 서로 다른 열거 형 식별자는 값이 서로 같을 수 있습니다.

NSArray에 열거 형 항목을 추가하는 것은 정수를 추가하는 것만 큼 간단합니다. 유일한 차이점은 enum 식별자를 대신 사용한다는 것입니다.

[myArray addObject:[NSNumber numberWithInt:UIViewAnimationCurveEaseInOut]]; 

당신은 단순히 콘솔에 각각 열거를 출력하고 당신을 제공하는 값을 확인하여 자신이을 확인할 수 있습니다. 이렇게하면 운영 방식에 대한 세부 정보를 조사 할 수 있습니다. 하지만 대부분의 경우 하루 하루를 알 필요가 없습니다.

1

Objective-C의 열거 형은 바닐라 C의 열거 형과 같습니다. 단지 int입니다. 당신이있는 NSArray를 사용하는 경우, 그것은 포인터를 기대하고 당신이 그것에 int를 추가하려고하면 당신은 경고를 얻을 것이다 :

NSMutableArray *myArray = [[NSMutableArray alloc] init]; 
[myArray addObject:UIViewAnimationCurveEaseInOut]; 

// Last line results in: 
// warning: passing argument 1 of 'addObject:' makes 
// pointer from integer without a cast 
4

열거 형은 전형적으로 값을 int로. 당신은의 NSNumber에 그들을 배치하여 배열에 저장할 수 있습니다 :

[myMutableArray addObject:[NSNumber numberWithInt:myAnimationCurve]]; 

... 다음 그들에게이처럼 다시 얻을 :

UIViewAnimationCurve myAnimationCurve = [[myMutableArray lastObject] intValue]; 
1

많은 수의 32 비트 정수를 저장하는 경우 NS 컬렉션 유형 대신 적절한 CF 수집 유형을 사용하는 것이 좋습니다. 이것들은 사용자 정의 retain 메소드를 전달할 수있게 해줍니다.이 메소드는 콜렉션에 추가 된 모든 정수를 채울 필요를 없애줍니다.

예를 들어, 32 비트 정수의 직선 배열이 필요하다고 가정 해 봅시다. 사용 :

CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL); 

마지막 매개 변수는 전달할 "주소"를 유지하거나 해제하지 않도록 배열에 지시합니다. 그래서 다음과 같이하면 :

CFArrayAppendValue(arrayRef, 1); 

배열은 메모리 주소 0x1에있는 객체에 대한 포인터를 전달하고 있다고 생각합니다.하지만 포인터에 retain/release를 호출하지 말라고 했으므로 컬렉션에 의해 표준 int로 처리됩니다.

교육적 가치를위한 FWIW, 표준 NSMutableArrays에는 동일한 CF 유형이 있습니다. 무료 브리징을 통해 당신은 표준 재단 모음으로 CF 모음을 사용할 수 있습니다

CFMutableArrayRef arrayRef = CFArrayCreateMutable(kCFAllocatorDefault, 0, kCFTypeArrayCallbacks); 
NSMutableArray *array = (NSMutableArray *)arrayRef; 
[array addObject:@"hi there!"]; 
NSLog(@"%@", [array objectAtIndex:0]); // prints "hi there!" 

당신은 (CFDictionary/CFMutableDictionary와) 사전에 같은 트릭을 적용 할 수 세트 (CFSET/CFMutableSet) 등

관련 문제