2012-10-31 4 views
5

iOS 6 프로젝트의 여러 위치에서 NSMapTable을 사용하고 있으며 객체에 액세스하기 위해 새로운 사전 첨자 스타일을 사용하고자합니다. (NSMapTable 상점을 NSMutableDictionary처럼 대부분 동작하지만 키에 대한 다양한 메모리 관리 옵션을 구성 할 수 있고 값 더 많은 배경을 this StackOverflow question에..)iOS 6의 NSMapTable에 대한 subscripting 구문

시도 할 때 이것이 NSMapTable 인스턴스 구문을 첨자 사용하는 컴파일러 보고서 :

'NSMapTable *'유형의 개체에없는 사전 요소를 읽을 예상 된 방법입니다.

가 어떻게 NSMapTable 새로운 NSDictionary 스타일 첨자를 할 수 있도록 확장 할 범주를 사용할 수 있습니다 ?

답변

4

답변은 실제로 간단합니다. 서브 스크립 션이 구현되는 방법에 대한 자세한 내용은 this question을 참조하십시오. 이런 카테고리를 추가하십시오.

헤더 :

@interface NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; 
- (id)objectForKeyedSubscript:(id)key; 

@end 

구현 :

이 첨자 액세스 실제로 일부 또는 모든 경우에 다른 것보다 작은 조금 느린 여부 나, 잠시, 궁금합니다
@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key { 
    [self setObject:obj forKey:key]; 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end 

하지만, 단어 "조기 최적화"는 그 생각을 중요하지 않게 만든다.

+1

이 IMO, 이것은 좋은 생각이 아니다. 'NSMapTable'에는 이유 때문에 subscripting이 없습니다. 예를 들어'NSPointerFunctionsStrongMemory'를 사용하여 NSMapTable을 얻었다면 왜 NSCopying을 준수해야합니까? 이 카테고리는 실제로'NSMapTable'을 사전과 같은 컬렉션에 사용하지 못합니다. –

+0

@RudolfAdamkovic 당신은 구독 메서드 선언에서'NSCopying'의 사용을 피할 수 있습니다. – k06a

2

개선 @mjh의 nil 키 객체를 설정하는 방법에 대한 NSDictionary의 행동 대답하고의 Obj-C 제네릭을 추가 :

@interface NSMapTable<KeyType, ObjectType> (Subscripting) 

- (void)setObject:(ObjectType)obj forKeyedSubscript:(KeyType)key; 
- (ObjectType)objectForKeyedSubscript:(KeyType)key; 

@end 

@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id)key { 
    if (object) { 
     [self setObject:obj forKey:key]; 
    } else { 
     [self removeObjectForKey:key]; 
    } 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end 
관련 문제