динамическое связывание в задаче C - PullRequest
0 голосов
/ 25 июля 2011

У меня есть класс Topic и Group, у которых есть переменная с именем 'name', поэтому я пытаюсь объединить эти два оператора if в один:

if ([((RKMappableObjectTableItem *) _item).object isKindOfClass:[Group class]]){
        Group * group = (Group *)(((RKMappableObjectTableItem *) self.object).object);
       //blah
    } else if ([((RKMappableObjectTableItem *) _item).object isKindOfClass:[Topic class]]){
        Topic * topic = (Topic *)(((RKMappableObjectTableItem *) self.object).object);
       //blah
    }

Я пытался

id group = (((RKMappableObjectTableItem *) self.object).object);

но когда я попробовал имя_группы, мне выдается:

Имя свойства не найдено для объекта типа id

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

В Objective-C свойства подвергаются более строгой проверке типов во время компиляции.

Вы можете попробовать:

[group name];

В данном случае вы не используете механизм свойств и не отправляете сообщение объекту. Это позволит вам в полной мере использовать динамическую природу Objective-C.

В этом случае вы получите предупреждение, но если вы можете выдержать его, оно должно работать нормально.

1 голос
/ 25 июля 2011

Вы можете использовать селектор, чтобы проверить, реализует ли объект метод перед вызовом этого метода для объекта.

SEL method = @selector(name:);
id groupOrTopic = [((RKMappableObjectTableItem *) self.object) object];

if ([groupOrTopic respondsToSelector:method])
    [groupOrTopic name];

Я бы не рекомендовал использовать базовый класс для обоих этих объектов, я бы порекомендовал определить протокол и заставить оба этих объекта реализовать этот протокол, если вы решите получить этот маршрут.

@protocol SomeProtocol
  -(NSString*)name;
@end
0 голосов
/ 25 июля 2011

Компилятор правильный, group не имеет свойства, называемого name.group имеет тип id, а не Topic или Group.

Три варианта:

  1. Приведите его
  2. Избегайте использования точечной записи:[group name]
  3. Базовый класс, общий для Topic и Group, имеет свойство name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...