2009-02-11 2 views
182

Я хотел бы проверить, является ли объект (например, someObject) назначаемым (отлитым от броска) переменной другого типа (например, SpecifiedType). На Java я могу написать:В Objective-C, что эквивалентно ключевому слову Java «instanceof»?

someObject instanceof SpecifiedType 

Связанный с этим вопрос заключается в том, соответствует ли тип времени выполнения другому типу. На Java я могу написать:

someObject.getClass().equals(SpecifiedType.class) 

Как это можно сделать в Objective-C?

+0

См. Также: http://stackoverflow.com/q/8294076/165674 –

ответ

251

Попробуйте [myObject class] для возврата класса объекта.

Вы можете сделать точные сравнения с:

if ([myObject class] == [MyClass class]) 

но не используя непосредственно MyClass идентификатор.

, подобным образом, вы можете найти, если объект подкласса вашего класса с:

if ([myObject isKindOfClass:[AnObject class]]) 

как предложил Джон тарелочкам и Zoul.

+0

Как я могу проверить равенство с объектом типа «AnObject», например? – Dimitris

+0

"if ([myObject class] == [класс AnObject])" или, как было предложено Jon Skeet и zoul: "if ([myObject isKindOfClass: [класс AnObject]])" – mouviciel

+7

Точное сравнение также можно выполнить с помощью 'if ([myObject isMemberOfClass: [класс MyClass]]) ' – user102008

37

От Wikipedia:

В Objective-C, например, как родовое Object и NSObject (в какао/OpenStep) обеспечивают метод isMemberOfClass: который возвращает true если аргумент методу является экземпляром указанного класса. Метод isKindOfClass: аналогично возвращает true, если аргумент наследует из указанного класса.

isKindOfClass: будет самым близким к instanceof, по его звукам.

8

См. Метод isKindOfClass: в документации NSObject. (Обычное слово предупреждения для такого вопроса заключается в том, что проверка класса объекта часто является признаком того, что что-то не так.)

+2

Просто копирование из« ответа »ниже:« @Zoul - почему использование проверки типа класса считается плохим? Не слишком ли это защитное программирование или вы утверждаете, что это должно быть ненужным? " –

+1

Ага, спасибо. Одна из проблем заключается в том, что объекты не обязательно должны быть класса, который вы ожидаете. Во время тестирования довольно распространено прохождение класса, который отличает интерфейс, но имеет другой класс. Или когда вы наблюдаете изменения ценности с помощью KVO, с классами происходит определенное волшебство. Оба случая вполне законны, и оба они легко разбиваются, если ваш код выполняет явные проверки класса. Переключение поведения в классе плохой дизайн OO, плотно связанный и трудно расширяемый. Я не говорю, что для проверки класса нет законного варианта использования, но перед этим нужно подумать дважды. – zoul

+0

@zoul В этом конкретном случае это было бы просто неопытным, скорее всего, использовать '+ (BOOL) соответствуетToProtocol: (Protocol *) aProtocol'. – EricLeaf

 Смежные вопросы

  • Нет связанных вопросов^_^