Objective-C'de Java'nın “instanceof” anahtar kelimesinin karşılığı nedir?


185

Bir nesnenin (örn. someObject) Başka bir türdeki (örneğin SpecifiedType) bir değişkene atanabilir (döküm) olup olmadığını kontrol etmek istiyorum . Java'da şunu yazabilirim:

someObject instanceof SpecifiedType

İlgili bir soru, bir nesnenin çalışma zamanı türünün başka bir türe eşit olup olmadığını bulmaktır. Java'da şunu yazabilirim:

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

Objective-C'de bu nasıl yapılabilir?


Yanıtlar:


264

[myObject class]Bir nesnenin sınıfını döndürmeyi deneyin .

Şununla tam karşılaştırmalar yapabilirsiniz:

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

ancak doğrudan MyClasstanımlayıcı kullanarak değil .

Benzer şekilde, nesnenin sınıfınızın bir alt sınıfına sahip olup olmadığını şu şekilde bulabilirsiniz:

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

Jon Skeet ve Zoul tarafından önerildiği gibi.


Örneğin "AnObject" türündeki bir nesne ile eşitliği nasıl kontrol ederim?
Dimitris

"if ([myObject class] == [AnObject sınıfı])" veya Jon Skeet ve zoul tarafından önerildiği gibi: "if ([myObject isKindOfClass: [AnObject class]]))"
mouviciel

8
tam karşılaştırma ile de yapılabilirif ([myObject isMemberOfClass:[MyClass class]])
user102008 22:11

37

Gönderen Vikipedi :

Amaç-C, örneğin, her ikisi de genel Objectve NSObject(kakao / OpenStep'in) yöntemi temin isMemberOfClass:döner trueyönteme bağımsız değişken belirtilen sınıfın bir örneği ise. Bağımsız isKindOfClass:değişken belirtilen sınıftan miras alırsa, yöntem benzer şekilde true değerini döndürür.

isKindOfClass:onun instanceofsesleri ile en yakın olurdu .


9

NSObject belgelerindeki isKindOfClass: yöntemine bakın . (Böyle bir soru için genel uyarı kelimesi, nesne sınıfını kontrol etmenin genellikle yanlış bir şey yapmanın bir işareti olduğudur.)


2
Sadece aşağıdaki "yanıt" dan kopyalamak: "@Zoul - sınıf tipi denetimi neden kötü sayılıyor?
Dan Rosenstark

1
Aha, teşekkürler. Bir sorun, nesnelerin beklediğiniz sınıfta olması gerekmemesidir. Test sırasında arayüzü onurlandıran, ancak farklı bir sınıfa sahip bir sınıf saplamasını geçmek oldukça yaygındır. Veya KVO kullanarak değer değişiklikleri gözlemlediğinizde, sınıflarla yapılan sihir vardır. Her iki durum da oldukça yasaldır ve kodunuz açık sınıf kontrolleri yaparsa her ikisi de kolayca kırılabilir. Sınıfta anahtarlama davranışı zayıf OO tasarımıdır, sıkıca bağlanmıştır ve uzatılması zordur. Sınıf kontrolleri için yasal bir kullanım durumu olmadığını söylemiyorum, ancak yapmadan önce iki kez düşünmelisiniz.
zoul

@zoul Bu özel durumda bu sadece basit bir deneyimsizliktir, muhtemelen daha fazla kullanılır + (BOOL)conformsToProtocol:(Protocol *)aProtocol.
EricLeaf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.