Как проверить наличие и тип свойства на основе типизированного ключа NSString?

В своем стремлении обновить модель Core Data в моем проекте iOS я запрашиваю у сервера объекты JSON, которые в некоторой степени соответствуют управляемым объектам моей модели. Конечным результатом, к которому я стремлюсь, является надежное решение для обновления выходных данных JSON.

В качестве примеров в этом вопросе я назову управляемый объект основных данных existingObj и входящий десериализованный словарь JSON updateDict . Сложная часть связана с этими фактами:

  1. Не все свойства existingObj присутствуют в updateDict
  2. Не все свойства updateDict доступны в extistingObj .
  3. Не все типы свойств existingObj соответствуют десериализованным свойствам JSON. (для некоторых строк может потребоваться специальная оболочка Objective-C).
  4. updateDict может содержать значения для ключей, которые не инициализированы ( nil ) в existingObj .

Это означает, что при просмотре обновленных словарей необходимо проводить некоторое тестирование свойств взад и вперед. Сначала мне нужно проверить, существуют ли свойства updateDict в existingObj , затем я установил значение с помощью KVC, например:

// key is an NSString, e.g. @"displayName"
if ([existingObj respondsToSelector:NSSelectorFromString(key)) {
    [existingObj setValue:[updateDict objectForKey:key] forKey:key];
}

Хотя эта часть работает, Мне не нравится тот факт, что я на самом деле тестирую displayName в качестве получателя, в то время как я собираюсь вызвать сеттер setDisplayName: (косвенно через KVC). Я бы предпочел что-то вроде [existingObj hasWritablePropertyWithName : key], но что-то, что делает это, я не могу найти.

Отсюда возникает подвопрос A: Как проверить средство задания свойства, если у вас есть только имя свойства?

В следующей части я хотел бы автоматизировать идентификацию свойств на основе их типов. Если и updateDict , и existingObj имеют NSString для ключа @ "displayName", установить новое значение будет легко. Однако, если updateDict содержит NSString для ключа @ "color", то есть @ " Но как мне проверить тип получающего свойства в existingObj , чтобы я знал, когда преобразовывать значения, а когда просто присваивать? Я надеялся на что-то вроде typeOfSelector:

if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
     // regular assignment
} else {
     // perform custom assignment
}

Конечно, это фиктивный код. Я не могу полагаться на тестирование типа значения existingObj -свойства, поскольку оно может быть унифицированным или nil .

Подвопрос B: Как проверять тип значения свойство, если у вас есть только название свойства?

Думаю, это все. Я подумал, что это, должно быть, обман того, что уже здесь, но я не смог его найти. Может, у вас получится?
Но как мне проверить тип получающего свойства в existingObj , чтобы я знал, когда преобразовывать значения, а когда просто присваивать? Я надеялся на что-то вроде typeOfSelector:

if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
     // regular assignment
} else {
     // perform custom assignment
}

Конечно, это фиктивный код. Я не могу полагаться на тестирование типа значения existingObj -свойства, поскольку оно может быть унифицированным или nil .

Подвопрос B: Как проверять тип значения свойство, если у вас есть только название свойства?

Думаю, это все. Я подумал, что это должно быть обман того, что уже здесь, но я не смог этого найти. Может, у вас получится?
поскольку оно может быть унифицировано или nil .

Подвопрос B: Как проверять тип свойства, если у вас есть только имя свойства?

Я думаю, что это все. Я подумал, что это должно быть обман того, что уже здесь, но я не смог этого найти. Может, у вас получится?
поскольку оно может быть унифицировано или nil .

Подвопрос B: Как проверять тип свойства, если у вас есть только имя свойства?

Я думаю, что это все. Я подумал, что это должно быть обман того, что уже здесь, но я не смог этого найти. Может, у вас получится?
Ура, EP.

PS Если у вас есть лучший способ синхронизировать пользовательские объекты Objective-C с десериализованными объектами JSON, поделитесь, пожалуйста! В конце концов, главное - результат.

5
задан epologee 9 February 2011 в 21:44
поделиться