違いは何であるisKindOfClass:(Class)aClass
とisMemberOfClass:(Class)aClass
の機能は?私はそれが小さなもののようであることを知っています、一方はグローバルで、もう一方はクラスの完全一致ですが、どちらを指定するかを誰かに指定する必要があります。
Swift isKind(of aClass: AnyClass)
およびisMember(of aClass: AnyClass)
。
違いは何であるisKindOfClass:(Class)aClass
とisMemberOfClass:(Class)aClass
の機能は?私はそれが小さなもののようであることを知っています、一方はグローバルで、もう一方はクラスの完全一致ですが、どちらを指定するかを誰かに指定する必要があります。
Swift isKind(of aClass: AnyClass)
およびisMember(of aClass: AnyClass)
。
回答:
isKindOfClass:
戻りYES
受信機があればインスタンスで指定されたクラスの、または任意のクラスのインスタンスは、その継承指定されたクラスから。
isMemberOfClass:
YES
レシーバが指定されたクラスのインスタンスである場合にのみ返します。
ほとんどの場合isKindOfClass:
、コードがサブクラスでも機能するようにするために使用します。
NSObjectのプロトコルリファレンスは、これらのメソッドについてもう少し話しています。
isKindOfClass:
オブジェクトが特定のクラスから継承するかどうかを示しますisMemberOfClass:
オブジェクトが特定のクラスのインスタンスであるかどうかを示します。[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
と思います
@interface A : NSObject
@end
@interface B : A
@end
...
id b = [[B alloc] init];
その後
[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
基本的に、-isMemberOfClass:
インスタンスが指定したクラスのもので-isKindOfClass:
ある場合はtrue、インスタンスが指定したクラスのものであるか、インスタンスの祖先の1つが指定したクラスのものである場合はtrueです。
-isMemberOfClass:
めったに使用されません。
isKindOfClass:レシーバーが特定のクラスのインスタンスであるか、そのクラスから継承する任意のクラスのインスタンスであるかを示すブール値を返します。
isMemberOfClass:レシーバーが指定されたクラスのインスタンスであるかどうかを示すブール値を返します。
クラスクラスターがあるため、isMemberOfClassは予想外の答えを与える可能性があります。多くの場合、最適な選択は-(BOOL)conformsToProtocol:(SEL)aSelectorまたは-(BOOL)conformsToProtocol:(Protocol *)aProtocolです。つまり、クラス/サブクラスをテストするよりも、ニーズに応えられる場合はこれらをテストする方が良いでしょう。
NSObjectクラスとプロトコルについては、アップルのドキュメントを参照してください。