No Objective-C, qual é o equivalente da palavra-chave "instanceof" do Java?

185

Gostaria de verificar se um objeto (por exemplo someObject) é atribuível (passível de conversão) a uma variável de outro tipo (por exemplo SpecifiedType). Em Java, eu posso escrever:

someObject instanceof SpecifiedType

Uma pergunta relacionada é descobrir se o tipo de tempo de execução de um objeto é igual a outro tipo. Em Java, eu posso escrever:

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

Como isso pode ser feito no Objective-C?

Darthenius
fonte
Veja também: stackoverflow.com/q/8294076/165674
Dheeraj Vepakomma

Respostas:

264

Tente [myObject class]retornar a classe de um objeto.

Você pode fazer comparações exatas com:

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

mas não usando MyClassidentificador direto .

Da mesma forma, você pode descobrir se o objeto é de uma subclasse da sua classe com:

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

como sugerido por Jon Skeet e zoul.

mouviciel
fonte
Como eu verificaria a igualdade com um objeto do tipo "AnObject", por exemplo?
11119 Dimitris
"if ([classe myObject] == ​​[classe AnObject])" ou, como sugerido por Jon Skeet e zoul: "if ([myObject isKindOfClass: [classe AnObject]]))"
mouviciel
8
comparação exata também pode ser feito comif ([myObject isMemberOfClass:[MyClass class]])
user102008
37

Da Wikipedia :

No Objective-C, por exemplo, o genérico Objecte NSObject(no Cocoa / OpenStep) fornecem o método isMemberOfClass:que retorna truese o argumento para o método for uma instância da classe especificada. O método isKindOfClass:retorna analogicamente true se o argumento herdar da classe especificada.

isKindOfClass:seria o mais próximo instanceof, pelos sons.

Jon Skeet
fonte
9

Consulte o método isKindOfClass: na documentação do NSObject . (A palavra usual de advertência para essa pergunta é que verificar a classe de objeto geralmente é um sinal de que algo está errado.)

zoul
fonte
2
Apenas copie da "resposta" abaixo: "@Zoul - por que usar a verificação de tipo de classe é considerado ruim? Isso não é uma boa programação defensiva ou você está argumentando que deveria ser desnecessário?"
Dan Rosenstark
1
Aha, obrigada. Um problema é que os objetos não precisam ser da classe que você está esperando. Durante o teste, é bastante comum passar um esboço de classe que honra a interface, mas tem uma classe diferente. Ou quando você observa mudanças de valor usando o KVO, há certa mágica feita com as classes. Ambos os casos são bastante legítimos e facilmente quebrados se o seu código faz verificações explícitas de classe. O comportamento da troca de classe é um projeto pobre de OO, fortemente acoplado e difícil de estender. Não estou dizendo que não há um caso de uso legítimo para verificações de classe, mas você deve pensar duas vezes antes de fazer isso.
zoul
@zoul Nesse caso específico, isso seria simplesmente inexperiência, seria mais provável que alguém usasse + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
21413 EricHeaf