Я пытаюсь создать упорядоченный словарь в качестве подкласса NSMutableDictionary. Я использовал this article в качестве руководства, но я попытался выполнить свою собственную реализацию, прочитав документацию NSDictionary
и NSMutableDictionary
, что привело к тому, что я делал это немного иначе, чем в статье. А именно, аргумент для ключа setObject:forKey:
должен быть id<NSCopying>
(согласно документации), которого нет в статье.Не удается получить элементы из подкаталога NSMutableDictionary
Проблема заключается в том, когда я установил какое-то значение в setObject:forKey:
, я не могу получить его надежно - это иногда найти объект для этого ключа, а иногда нет. Я не использую блоки или потоки или GCD где-нибудь в своем приложении, поэтому я не понимаю, как это может быть случайным образом.
Вот мой код:
// BBOrderedDictionary.h
@interface BBOrderedDictionary : NSMutableDictionary
@end
// BBOrderedDictionary.m
@interface BBOrderedDictionary()
@property (nonatomic, strong) NSMutableArray* array;
@property (nonatomic, strong) NSMutableDictionary* dictionary;
@end
@implementation BBOrderedDictionary
-(instancetype)init
{
return [self initWithCapacity:0];
}
-(instancetype)initWithCapacity:(NSUInteger)numItems
{
self = [super init];
if (self) {
self.array = [NSMutableArray array];
self.dictionary = [NSMutableDictionary dictionary];
}
return self;
}
# pragma mark - Primitive Methods
// NSMutableDictionary Primitive Methods
-(void)setObject:(id)anObject forKey:(id<NSCopying>)aKey
{
if (![self.dictionary objectForKey:aKey]) {
[self.array addObject:aKey];
}
[self.dictionary setObject:anObject forKey:aKey];
}
-(void)removeObjectForKey:(id)aKey
{
[self.dictionary removeObjectForKey:aKey];
[self.array removeObject:aKey];
}
// NSDictionary Primitive Methods
-(NSUInteger)count
{
return [self.dictionary count];
}
-(id)objectForKey:(id)aKey
{
return [self.dictionary objectForKey:aKey];
}
-(NSEnumerator *)keyEnumerator
{
return [self.array objectEnumerator];
}
#pragma mark - Other
-(NSArray *)allKeys
{
return self.array;
}
@end
Следует отметить, что мои ключи пользовательского объекта, а также, что соответствует NSCopying
и реализует isEqual:
. Он отлично работает как ключ в NSMutableDictionary
.
Когда я поставил точку останова в objectForKey:
, я могу подтвердить, что внутренний словарь действительно есть все, что я вложил в нее, но (от сдачи журнала в isEqual:
методе моего ключа класса), он не проверяет все свои ключи для равенства с ключевым аргументом. Есть идеи?
Правильно ли вы использовали метод 'hash' в своем пользовательском классе, используемом в качестве ключей? Это требуется вместе с 'isEqual:'. – rmaddy
Возможно, вы захотите проверить [Упорядоченный диктофон] (https://code.google.com/p/upnpx/source/browse/trunk/src/upnp/OrderedDictionary.h?spec=svn289&r=289) Мэтта Галлахера. Также [какао-сортированный словарь] (https://code.google.com/p/coco-sorted-dictionary/). – zaph
@ Zaph: Статья, с которой я связан, был Мэтт Галлахер и рассказывает о причинах, лежащих в основе кода, с которым вы связались. – Shinigami