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

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

23 голосов
/ 29 декабря 2011

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

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

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

спасибо,

Ответы [ 5 ]

23 голосов
/ 29 декабря 2011

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

17 голосов
/ 29 декабря 2011

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

  1. Как традиционный словарь / хэш-карта, в которой вы устанавливаетезначения, подобные этому:

    [myDictionary setObject: theValue forKey: anyObject];

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

    [myDictionary setValue: theValue forKey: aString];

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

7 голосов
/ 29 декабря 2011

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

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

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

3 голосов
/ 29 декабря 2011

С NSDictionary ссылка

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

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

1 голос
/ 29 декабря 2011

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

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

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

В то время как CFDictionary «бесплатный»соединившись со своим коллегой из Фонда Какао, NSDictionary, я обнаружил, что с этим по-прежнему есть проблемы.Я пытался добавить объекты, которые не были частью протокола NSCopying, к моему бесплатному мостовому NSDictionary, и во время выполнения возникла ошибка.

CFDictionary docs: 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 документы: http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFMutableDictionaryRef/Reference/reference.html#//apple_ref/doc/uid/20001497

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...