Мне нужно реализовать интерфейс, который имитирует MKMapView
в некотором смысле. В частности, мне нужно поддерживать методыКак хранить данные с ключами ключа, которые не являются NSCopying
-(void)addAnnotation:(id<MyAnnotation>)annotation;
-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation;
Внутри есть отображение, которое отображает аннотацию к UIView
объекта (который может быть пустым).
Итак, как хранить эти аннотации и соответствующие представления? Естественный выбор будет NSMutableDictionary
:
@property(nonatomic) NSMutableDictionary *m_dict;
-(void)addAnnotation:(id<MyAnnotation>)annotation {
UIView *view = ....;
if (view) {
[_m_dict setObject:view forKey:annotation];
}
else {
[_m_dict setObject:[NSNull null] forKey:annotation];
}
}
-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation {
id ret = [_m_dict objectForKey:annotation];
if ([ret isKindOfClass:[UIView class]]) {
return ret;
}
return nil;
}
Но это не работает, потому что нет никакой гарантии, что id<MyAnnotation>
соответствует NSCopying
.
Я думал о сохранении id<MyAnnotation>
необработанному указателю, а затем сохранил указатель на NSNumber
(который соответствует NSCopying
). Но я не уверен, что это хорошая идея и как реализовать ее безопасно.
Вы считаете NSHashTable? http://nshipster.com/nshashtable-and-nsmaptable/ – Mats