Reputation: 16008
What is the difference between the isKind(of aClass: AnyClass)
and the isMember(of aClass: AnyClass)
functions in Swift?
Original Question in Objective-C
What is the difference between the
isKindOfClass:(Class)aClass
and theisMemberOfClass:(Class)aClass
functions? I know it is something small like, one is global while the other is an exact class match but I need someone to specify which is which please.
Upvotes: 161
Views: 43254
Reputation: 12195
isKindOfClass:
returns YES
if the receiver is an instance of the specified class or an instance of any class that inherits from the specified class.
isMemberOfClass:
returns YES
if, and only if, the receiver is an instance of the specified class.
Most of the time you want to use isKindOfClass:
to ensure that your code also works with subclasses.
The NSObject Protocol Reference talks a little more about these methods.
Upvotes: 276
Reputation: 2804
Because of class clusters, isMemberOfClass can give you an answer you might not expect. In many cases your best choice is more likely to be -(BOOL)conformsToProtocol:(SEL)aSelector or - (BOOL)conformsToProtocol:(Protocol*)aProtocol. I.e, it's better to test these if they can answer your need rather than testing class/subclass.
See apple doc for NSObject class and protocol:
Upvotes: 0
Reputation: 12787
isKindOfClass-> return YES when the object is instance of that class or instance of a class which is inherited from it.
isMemberOfClass: return YES when the object is instance of that class but No in case: instance of a class which is inherited from it.
example is good enough in jtbandes answer.
Upvotes: 2
Reputation: 12036
isKindOfClass: Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class.
isMemberOfClass: Returns a Boolean value that indicates whether the receiver is an instance of a given class.
Upvotes: 9
Reputation: 118691
isKindOfClass:
indicates whether an object inherits from a given classisMemberOfClass:
indicates whether an object is an instance of a given class.[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
Upvotes: 84
Reputation: 523344
Suppose
@interface A : NSObject
@end
@interface B : A
@end
...
id b = [[B alloc] init];
then
[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
Basically, -isMemberOfClass:
is true if the instance is exactly of the specified class, while -isKindOfClass:
is true if the instance is exactly of the specified class or if one of the instance's ancestors is of the specified class.
-isMemberOfClass:
is seldom used.
Upvotes: 48