У Objective-C, що таке еквівалент ключового слова Java "instanceof"?


185

Я хотів би перевірити, чи об'єкт (наприклад someObject) може бути присвоєний (може бути відданий) змінній іншого типу (наприклад SpecifiedType). На Java я можу написати:

someObject instanceof SpecifiedType

Пов'язане питання полягає у встановленні того, чи тип виконання об'єкта дорівнює іншому типу. На Java я можу написати:

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

Як це можна зробити в Objective-C?


Відповіді:


264

Спробуйте [myObject class]повернути клас об'єкта.

Ви можете зробити точні порівняння з:

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

але не за допомогою прямого MyClassідентифікатора.

Аналогічно можна дізнатися, чи об’єкт є підкласом вашого класу з:

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

як пропонують Джон Скіт і Зул.


Як я можу перевірити рівність, наприклад, з об'єктом типу "AnObject"?
Димитріс

"if ([клас myObject] == ​​[клас AnObject])" або, як це запропонував Джон Skeet і zoul: "if ([myObject isKindOfClass: [AnObject class]])"
mouviciel

8
точне порівняння також можна виконати зif ([myObject isMemberOfClass:[MyClass class]])
user102008

37

З Вікіпедії :

Наприклад, в Objective-C і generic, Objectі NSObject(в Cocoa / OpenStep) надають метод, isMemberOfClass:який повертається, trueякщо аргумент методу є екземпляром зазначеного класу. Метод isKindOfClass:аналогічно повертає значення true, якщо аргумент успадковується від вказаного класу.

isKindOfClass:була б найближчою instanceof, за її звуками.


9

Дивіться метод isKindOfClass: у документації NSObject . (Звичайне слово попередження для такого питання полягає в тому, що перевірка класу об'єктів часто є ознакою того, що робимо щось не так.)


2
Просто копіювання з "відповіді" нижче: "@Zoul - чому використання перевірки типу класу вважається поганим? Це не гарне оборонне програмування чи ти стверджуєш, що воно повинно бути непотрібним?"
Дан Розенстарк

1
Ага, дякую. Одна проблема полягає в тому, що об’єкти не повинні бути класом, якого ви очікуєте. Під час тестування досить часто передавати заглушку класу, яка шанує інтерфейс, але має інший клас. Або коли ви спостерігаєте зміни значень за допомогою KVO, з класами виконується певна магія. Обидва випадки є досить законними, і обидва легко порушуються, якщо ваш код робить явні перевірки класу. Поведінка перемикання на клас погана конструкція OO, щільно з'єднана і важко розширюється. Я не кажу, що для перевірки класу немає законного використання, але ви повинні подумати двічі, перш ніж це зробити.
Зуль

@zoul У цьому конкретному випадку це було б просто досвідом, скоріше за все, можна скористатися + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.