Кодирование значения ключа и его возможности сценариев - PullRequest
3 голосов
/ 19 декабря 2008

У меня есть объект, который прямо переменные экземпляра. Некоторые из них - NSString, некоторые - беззнаковые целые и т. Д. У меня сложилось впечатление, что кодирование Key-Value можно было выполнить с помощью сценариев, так как я мог написать такой код:

   id key, value;
   key      = [[attributes objectAtIndex:j] name];
   value    = [[attributes objectAtIndex:j] stringValue];
   [obj setValue:value forKey:key];

Причина, по которой я здесь использую stringValue и имя, заключается в том, что я работаю с TouchXML и строю объекты из каналов XML.

Приведенный выше код вылетает, если я пытаюсь присвоить что-либо целому числу. Если я изменю свой unsigned int на экземпляр NSString, не произойдет никаких сбоев во время выполнения. Насколько я понимаю, кодирование значения ключа достаточно умен, чтобы обнаружить эту проблему.

Каковы мои возможные решения? Как я могу абстрагировать это как можно больше, чтобы я мог запустить один и тот же метод для множества разных классов, у всех из которых есть свои собственные переменные экземпляра?

Является ли самый элегантный способ действительно переопределить мой установщик и использовать NSNumber для преобразования строки в тип int, который, как я думал, уже был обработан KVC?

1 Ответ

3 голосов
/ 19 декабря 2008

KVC не выполняет никакого принуждения / преобразования типов внутри, поэтому тип объекта, который вы передаете в setValue:forKey:, должен соответствовать типу переменной экземпляра, в которой он будет храниться. Собственные типы, такие как int, long и т. Д. Упакованы в NSNumber объекты, а такие вещи, как структуры, упакованы в NSValue объекты. Чтобы установить значение, объявленное как нативный тип, вы должны передать соответствующий объект-обертку для аргумента значения.

Я бы также порекомендовал сделать любой необходимый перевод в коде, который вызывает сеттер, а не в самом сеттере. Хотя это скорее вопрос мнения, так что я полагаю, вы могли бы переводить вещи в сеттере, если вы действительно этого хотите. Моя версия вашего кода будет выглядеть примерно так:

id key, value;
key = [[attributes objectAtIndex:j] name];
value = [NSNumber numberWithInt:[[[attributes objectAtIndex:j] stringValue] intValue]];
[obj setValue:value forKey:key];
...