Как я обычно использую KVC для обновления полей? - PullRequest
3 голосов
/ 18 ноября 2008

Скажем, у меня есть следующий класс Objective-C:

@interface Foo {
     int someNumber;
     NSString *someString;
}

и по причинам, о которых я не буду здесь говорить, я хочу использовать KVC для общего обновления значений этих переменных:

[f setValue:object forKey:@"someNumber"];

or

[f setValue:object forKey:@"someString"];`

Если object является строкой, и я обновляю переменную someNumber, мне кажется, мне нужно знать, как использовать NSNumberFormatter для получения NSNumber, а затем Cocoa автоматически преобразует его в int внутри setValue:forKey:.

Есть ли способ избежать этого пользовательского кода и заставить Какао выводить преобразование в int из строки, или мне нужно каждый раз перехватывать эту ситуацию и обрабатывать ее самостоятельно?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2008

Следующий код должен обрабатывать преобразование автоматически, если параметр object является членом класса, который реализует integerValue.

Обратите внимание, что и NSNumber, и NSString реализуют этот метод.

- (void)setValue:(id)object forKey:(NSString *)key
{
    if ([key isEqual:@"someNumber"])
    {
        someNumber = [object integerValue];
    }
    //...
}

изменить: (примечание): Вы можете избежать написания метода самостоятельно, используя свойства target-c. Реализация по умолчанию setValue:forKey: будет работать за вас, если вы создадите свойства для someNumber и someString.

1 голос
/ 18 ноября 2008

У меня есть мудрец в этом. Я думаю, что setValue: forKey: эквивалентно прямому вызову сеттера. Если у вас был метод:

- (void)setSomeValue:(NSInteger)aValue

Вы не ожидаете, что сможете передать NSString, и надеетесь, что метод сможет это выяснить.

Другими словами, значение ключа дает вам доступ к свойству, и это свойство имеет тип. При использовании KVC числа просто оборачиваются в объект NSNumber, так что есть только один setValue: forKey: метод. Поэтому я говорю, что вызывающий код всегда обязан упаковать строку в объект NSNumber.

В такие времена я жалуюсь, что Cocoa Touch не поддерживает привязки. Привязки позволят вам добавить преобразователь значения, который может автоматически выполнять преобразование из строки в число. Возможно в следующей версии!

1 голос
/ 18 ноября 2008

Вы должны выполнить преобразование самостоятельно с помощью средства форматирования чисел, оно дает вам более точное управление, чем все, что фреймворк может счесть целесообразным. Также, вероятно, не очень хорошая идея использовать один экземпляр объекта для обновления значений для ваших ivars. Более целесообразно, чтобы вы могли выполнить свое обновление на основе класса объекта (при условии, что вы не сохраняете в id, запрашивая время выполнения относительно класса объекта с помощью object_getClassName. Более подробная информация доступна в Objective-C 2.0 Runtime Reference. Но в целом вы, скорее всего, найдете ошибки в своем коде в результате таких действий.

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