Используя класс как ключ в NSDictionary

Можете ли вы проверить, что ваша бездействующая анимация изменяет свою позицию в любом случае.

37
задан Craig Otis 8 April 2009 в 13:42
поделиться

5 ответов

Вы используете setValue: forKey: , который принимает только NSString s в качестве ключей. вы должны использовать вместо этого setObject: forKey: . Объект класса (указатели на объекты классов могут передаваться как тип Class ) является полноценным объектом Objective-C (объект класса является экземпляром его мета-класса, и вы можете использовать все Методы NSObject для объекта класса, подробнее о мета-классах здесь ), поэтому они могут использоваться везде, где используются объекты.

Другим требованием к ключам словаря является то, что они поддерживают копирование (т. Е. Имеют метод copyWithZone: . Поддерживают ли объекты класса этот метод? Фактически, это так. Класс NSObject определяет метод класса + copyWithZone: , чья документация явно говорит, что он «позволяет использовать объект класса в качестве ключа к объекту NSDictionary». Я думаю, что это ответ на ваш вопрос.

98
ответ дан 27 November 2019 в 04:03
поделиться

-setValue: forKey: задокументировано для получения строки NSString в качестве второго параметра , Вам нужно будет использовать NSStringFromClass () и NSClassFromString () в качестве адаптеров.

4
ответ дан user23743 27 November 2019 в 04:03
поделиться

Я искал setObject: forKey : метод вместо setValue: forKey :. Подпись метода для setObject: forKey: принимает (id) в качестве обоих типов параметров и подходит гораздо лучше.

3
ответ дан Craig Otis 27 November 2019 в 04:03
поделиться

У меня только что была похожая ситуация с тем же сообщением об ошибке:

[tempDictionary setObject:someDictionary forKey:someClass];

Все, что я сделал, это реализовал протокол NSCopying в someClass :

- (id)copyWithZone:(NSZone *)zone
{
    id copy = [[[self class] allocWithZone:zone] init];
    [copy setId:[self id]];
    [copy setTitle:[self title]];
    return copy;
}

Я думаю, что происходило то, что была сделана копия someClass для использования в качестве ключа, но так как мой объект не знал, как копировать себя (производный от NSObject у него не было copyWithZone в суперклассе) он отказался.

Одна вещь, которую я нашел с моим подходом, состоит в том, что он использует объект в качестве ключа. Если объект уже не создан, я постоянно вызываю allKeys или просто перечисляю по словарю иным образом.

[После этого я вижу, что вы хотите сохранить класс как ключ. Я оставляю это там, потому что я бы сэкономил много времени, если бы нашел свой ответ, когда искал SO. Тогда я не нашел ничего подобного.]

1
ответ дан 27 November 2019 в 04:03
поделиться

Другой вариант - использовать [NSValue valueWithNonrehibitedObject: yourObjectHere] , чтобы построить ключ не из строки. У меня возникла аналогичная проблема, и я хотел использовать объект CoreData в качестве ключа и что-то еще в качестве значения. Этот метод NSValue работал идеально, и я считаю, что это было его первоначальное предназначение. Чтобы вернуться к исходному значению, просто вызовите nonrehibitedObjectValue

30
ответ дан 27 November 2019 в 04:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: