Цель C, как запросить, принадлежит ли объект определенного класса - PullRequest
4 голосов
/ 08 апреля 2010

Я производный от TableViewCell. Когда я запрашиваю табличное представление о пути индекса, он возвращает UITableViewCell. Как мне узнать, является ли этот объект одним из моих пользовательских типов "CustomCell"?

Ответы [ 4 ]

3 голосов
/ 08 апреля 2010
if ([cell isKindOfClass:[CustomCell class]]) {
    [(CustomCell*)cell customCellMethod];
}
2 голосов
/ 08 апреля 2010
if ([cell isKindOfClass:[CustomCell class]]) {
   // ...
}
1 голос
/ 08 апреля 2010

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

Не важно, что дизайн гораздо лучше зависеть от интерфейса (a @protocol в Objective-C), чем от класса, поскольку он помогает отделить ваш дизайн. Определите @protocol с соответствующим API, который вам нужен, и пусть ваш CustomCell реализует этот протокол. Затем в своем коде вы можете проверить:

if([cell conformsToProtocol:@protocol(MyCellProtocol)]) {
  //...
}

, а не тестирование на идентичность класса.

Если вам нужен только один метод, вы можете использовать [cell respondsToSelector:@selector(myMethod)].

0 голосов
/ 09 апреля 2010

На самом деле здесь можно использовать два метода.Вероятно, вам понадобится isKindOfClass:, но есть другой метод с именем isMemberOfClass:, который вернет YES только если получатель является экземпляром предоставленного классане экземпляр подкласса.

Например, если DerivedClass является подклассом BaseClass, то вот результаты каждого метода:

BOOL isKind = [aDerivedInstance isKindOfClass:[BaseClass class]]; // YES
BOOL isMember = [aDerivedInstance isMemberOfClass:[BaseClass class]]; // NO
...