Подтвердить что ты не робот

Objective-C эквивалент HashMap

Я пытаюсь преобразовать кусок кода Java, который использует HashMap, который содержит в качестве ключа объект и значение как объект.

private static HashMap<Class<? extends Component>, ComponentType> componentTypes = new HashMap<Class<? extends Component>, ComponentType>();

Я читал о том, как это сделать с Obj-C, но я не был успешным, большинство людей предлагают использовать NSDictionary, проблема в том, что они должны быть строками, и мне нужны они как объекты. Другой вариант - NSMapTable, однако он недоступен в iOS. Кто-нибудь сможет помочь, как я могу преобразовать это в эквивалент obj-c?

спасибо,

4b9b3361

Ответ 1

Ключи для NSDictionary не обязательно должны быть строками. Они могут быть любыми объектами, которые реализуют NSCopying. Однако, если объект является настраиваемым объектом, ему необходимо произвести разумные ответы на сообщения -hash и -isEqual:, но это то же самое, что использовать объект в коллекции Java, поэтому это не должно быть большой проблемой.

Ответ 2

An NSMutableDictionary (при условии, что вам также нужно установить значения в словаре после его инициализации) работает двумя способами:

  • Как традиционный словарь /hashmap, в котором вы устанавливаете такие значения:

    [myDictionary setObject: theValue forKey: anyObject];

  • Как объект с KVC-совместимыми свойствами, которые определяются динамически:

    [myDictionary setValue: theValue forKey: aString];

Если ключ является NSString, то эти два являются взаимозаменяемыми, за исключением того, что вы не можете установить объект nil с помощью setObject:forKey:, но вы можете передать nil на setValue:forKey:.

Ответ 3

Вы хотите использовать NSDictionary. Вы говорите, что

ключи должны быть строками, и они мне нужны как объекты

Ключи к NSDictionary не обязательно должны быть строками - они могут быть любыми объектами, которые соответствуют протоколу NSCopying.

Ответ 4

Из Ссылка на NSDictionary

Пара ключ-значение в словаре называется записью. Каждая запись состоит из одного объекта, который представляет ключ, а второй объект - это значение ключа. В словаре есть уникальные ключи. То есть, никакие два ключа в одном словаре не равны (как определено isEqual:). В общем случае ключ может быть любым объектом (при условии, что он соответствует протоколу NSCopying - см. Ниже), но обратите внимание, что при использовании кодирования с ключом ключ должен быть строкой (см. "Основы кодирования ключевых значений" ). Ни ключ, ни значение не могут быть равны нулю; если вам нужно представить нулевое значение в словаре, вы должны использовать NSNull.

Таким образом, любой объект, соответствующий протоколу NSCopying, может использоваться как ключ. Ограничение строки используется только для кодирования с ключом, используемого для привязок Cocoa

Ответ 5

Я предполагаю, что вы используете ключ, который не соответствует протоколу NSCopying. В этом случае попробуйте использовать эквивалент Core Foundation NSDictionary: CFDictionary.

http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html

Просто убедитесь, что когда вы используете CFDictionary, все ваши объекты будут сохранены в памяти в течение всего объекта. Поскольку CFDictionary должен быть установлен со слабыми ссылками (по крайней мере, по моему опыту), будьте осторожны, чтобы вы случайно не удалили одну из своих объектов, пока она еще находится в CFDictionary.

В то время как CFDictionary является "бесплатной мостовой" со своим Cocoa партнером Фонда NSDictionary, я считаю, что с этим все еще есть проблемы. Я попытался добавить объекты, которые не были частью протокола NSCopying, к моему бесплатному мостовому NSDictionary, и во время выполнения возникла ошибка.

Документы CFDictionary: http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html

Если вам нужна изменчивость, вместо этого используйте CFMutableDictionary:   cfd = CFDictionaryCreateMutable (NULL, 0, NULL, NULL);   CFDictionaryAddValue (cfd, ключ, значение);   CFRelease (CFD);

CFMutableDictionary docs: http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFMutableDictionaryRef/Reference/reference.html#//apple_ref/doc/uid/20001497