2009-09-02 3 views
61

Я хочу проверить тип объекта. Как я могу это сделать?iPhone, как проверить тип объекта?

Сценарий: Я получаю объект. Если этот объект имеет тип A, выполните некоторые операции. Если это тип B, выполните некоторые операции. В настоящее время тип объекта C является родителем A и B.

У меня есть два класса AViewController и BViewController. Объект, который я получаю в UIViewController. Теперь, как проверить, является ли объект AViewController или BViewController?

+0

контратип http://stackoverflow.com/questions/1144629/in -объективный-c-how-do-i-test-the-object-type – ennuikiller

ответ

152
if([some_object isKindOfClass:[A_Class_Name class]]) 
{ 
    // do somthing 
} 
+6

. Сообщение от @Jasarien более конкретно. Например, сравнивая, является ли объект KindOfClass [класс UIView], вы вернете даже все UIImageViews, UIImages, UIRoundRectButtons ..... Итак, в этом случае «isMemberOfClass может быть лучшим решением». –

44

В NSObject есть несколько методов, которые позволяют проверять классы.

Сначала есть -class, который вернет класс вашего объекта. Это вернет либо AViewController, либо BViewController.

Тогда есть два метода: -isKindofClass: и isMemberOfClass:.

-isKindOfClass: сравнивает приемник с классом, переданным как аргумент, и возвращает true или false на основании того, является ли класс одним и тем же типом или подклассом данного класса.

-isMemberOfClass: будет сравнивать приемник с классом, переданным как аргумент, и возвращать true или false на основании того, является ли класс строго тем же классом, что и данный класс.

3

Более общий шаблон в Objective-C, чтобы проверить, если объект реагирует на методы, которые вы заинтересованы в. Пример:

if ([object respondsToSelector:@selector(length)]) { 
    // Do something 
} 

if ([object conformsToProtocol:@protocol(NSObject)]) { 
    // Do something 
} 
+0

Это правда, но не очень полезно в этом случае Два объекта, интересующих вопросника, представляют собой оба подкласса определенного контроллера представления. Каждый может реализовать один и тот же метод, но вести себя по-разному. Поэтому он/она должен знать, к какому подклассу они имеют дело. – Jasarien

+0

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