У меня есть класс, который представляет некоторые данные.
Я получаю эти данные из веб-службы в формате JSON.
Веб-сервис не соответствует соглашению об именах Objective-C. Более конкретно, все атрибуты объекта начинаются с заглавной буквы, например Name
.
Я хочу иметь возможность использовать встроенный KVC, но по-прежнему создавать свои объекты в соответствии с соглашением об именах Objective-C.
Итак, в моем объявлении публичного класса я объявляю одно свойство:
@interface TVPage : NSObject
@property (nonatomic, copy) NSString *name;
@end
И в моем * .m файле я объявляю расширение категории в соответствии с соглашением об именах веб-служб:
@interface TVPage ()
@property (nonatomic, copy , getter = name , setter = setName:) NSString *Name;
@end
В приватном свойстве я указываю метод получения и установки, к которому я хочу получить доступ к данным.
Все, чего я хочу добиться, - это просто еще один метод, называемый Name
, который на самом деле вызовет name
за сценой. (setName:
на самом деле подходит для Name
и name
)
У меня вопрос, когда я синтезирую такие свойства:
@implementation TVPage
@synthesize name;
@synthesize Name;
@end
Будет ли он генерировать две разные переменные экземпляра, называемые Name
и name
, или он достаточно умен, чтобы понять, как этого не делать, и создать только одну по имени name
?
Можно ли явно указать компилятору - "Не генерировать IVar для этого свойства"?
Спасибо!
EDIT:
Зачем мне это делать?
Многие из вас спрашивали меня, чего именно я пытаюсь достичь здесь.
Что ж, я пытаюсь сделать мою жизнь проще, когда дело доходит до анализа данных, возвращаемых веб-службой.
Данные возвращаются в виде строки JSON. Это означает, что когда я его проанализирую, я, вероятно, вернусь NSDictionaries для представления данных.
Я хочу легко создавать объекты, которые я спроектировал для хранения этих данных, потому что работать со словарями в качестве модели данных не удобно, не безопасно и не читабельно.
Теперь функции Key-Value Coding позволяют мне устанавливать атрибуты объекта прямо из словаря, используя setValuesForKeysWithDictionary:
Но это будет работать, только если у моего объекта действительно есть методы доступа с теми же именами, что и у ключей словаря. Если в моем объекте есть ключ, у которого нет соответствующего атрибута, я получу исключение из setValue:forUndefinedKey:
.
Чтобы избежать этого, я хочу создать Facade Interface , который будет соответствовать методам кодирования значения ключа, подразумеваемым именами атрибутов с сервера. В то же время я хочу, чтобы реализация этого интерфейса получала те же данные, что и «обычный» интерфейс.