2009-07-23 2 views
10

이 코드는 UITableViewController 하위 클래스 인 viewDidLoad 메서드에 있습니다. UITableViewController 하위 클래스에는 테스트 메서드가 포함되어 있습니다.NSDictionary에 값으로 선택기를 포함 시키려면 어떻게해야합니까?

예외를 발생시키지 않고 충돌합니다. 나는 보통 직렬화에 더 탄력적이기 때문에 문자열을 사용하여 디버그 읽기 사전을 쉽게하는 것을 선호

// Set selector 
SEL inSelector = @selector(something:); 
NSValue *selectorAsValue = [NSValue valueWithBytes:&inSelector objCType:@encode(SEL)]; 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsValue, @"selector", nil]; 

// Retrieve selector 
SEL outSelector; 
[(NSValue *)[dict objectForKey:@"selector"] getValue:&outSelector]; 
// Now outSelector can be used as a selector, e.g. [self performSelector:outSelector] 

답변

5

사용 NSValue 셀렉터를 포장하는 산출.

// Set selector 
SEL inSelector = @selector(something:); 
NSString *selectorAsString = NSStringFromSelector(inSelector); 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsString, @"selector", nil]; 

// Retrieve selector 
SEL outSelector = NSSelectorFromString([dict objectForKey:@"selector"]); 
+3

NSValue는 객체의 비 객체 유형을 래핑하기위한 올바른 클래스입니다. NSPoint, NSRect 및 NSSize는 모두 전용 생성자를 가지고 있으며 숫자 유형은 NSNumber 하위 클래스로 래핑되지만 임의의 구조체를 래핑하고 객체를 보유하지 않고 객체를 래핑 할 수도 있습니다. 참고 ... NSValue는 * 입력 된 * 데이터 용입니다. 이진 데이터의 임의의 블록은 NSData로 래핑되어야합니다. –

+1

이것은 NSValue에 대한 카테고리를 요구합니다 – cfischer

15

pix0r의 솔루션은 좋지만 :

id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys: @"some text", @"text", @selector(test), @"selector", nil] 
+0

나는 이것에 동의합니다. SEL은 값 (일반적으로 C 스칼라 및 구조체를 나타냄)보다 더 자연스럽게 문자열 (이름이기 때문에)에 매핑합니다. – Chuck

+0

또한 위험한 게임을 할 수 있다면 열어 볼 수 있습니다. –

관련 문제