Ich muss eine Schnittstelle, die MKMapView
in gewissem Sinne nachahmt. Insbesondere müssen I Verfahren zur UnterstützungSo speichern Sie Daten mit ID-Schlüssel, die nicht NSCopying sind
-(void)addAnnotation:(id<MyAnnotation>)annotation;
-(UIView *)viewForAnnotation:(id<MyAnnotation>)annotation;
Intern gibt eine Abbildung, die eine Anmerkung zu einem UIView
Objekt abbildet ist (die null sein kann).
Also, wie sollte ich diese Anmerkungen und entsprechende Ansichten speichern? Die natürliche Wahl wäre 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;
}
Aber es funktioniert nicht, weil es keine Garantie dafür gibt, dass id<MyAnnotation>
NSCopying
entspricht.
Ich dachte über Speichern id<MyAnnotation>
zu einem rohen Zeiger und dann Speichern des Zeigers in NSNumber
(die NSCopying
entspricht). Aber ich bin mir nicht sicher, ob das eine gute Idee ist und wie man es sicher umsetzt.
Haben Sie NSHashTable in Betracht gezogen? http://shipster.com/nshashtable-and-nsmaptable/ – Mats