개체가 클래스 유형인지 확인합니다.
나는 a를 받는 방법이 있습니다.NSArray
의Class
물건들과 모든 물건들이Class
아래 코드와 함께 생성된 유형:
NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObject:[NSObject class]];
[arr addObject:[NSValue class]];
[arr addObject:[NSNumber class]];
[arr addObject:[NSPredicate class]];
[arr addObject:@"not a class object"];
문제는.Class
objective-c 클래스가 아니라 struct이므로 그냥 사용할 수 없습니다.
for (int i; i<[arr count]; i++) {
Class obj = [arr objectAtIndex:i];
if([obj isKindOfClass: [Class class]]) {
//do sth
}
}
그래서, 제가 확인해 봐야 해요.obj
변수는 a.Class
타이프, 아마 안에 있을 것입니다.C
직접적으로, 하지만 어떻게 해야 할까요?
답변에서 배열의 항목이 다음 항목인지 확인할 수 있는 방법도 제시한다면 이점이 될 것입니다.NSObject
, 예제 코드의 항목으로서,NSPredicate
또한true
를 위해NSObject
확인.
"객체"가 클래스인지 인스턴스인지 확인하려면 2단계 프로세스에서 메타 클래스인지 확인해야 합니다.먼저 전화를 걸어 메타 클래스인지 확인합니다.당신은 필요할 것입니다.#import <objc/runtime.h>
.
NSObject *object = [[NSObject alloc] init];
Class class = [NSObject class];
BOOL yup = class_isMetaClass(object_getClass(class));
BOOL nope = class_isMetaClass(object_getClass(object));
둘다요.Class
그리고.*id
동일한 구조 레이아웃(Class isa
), 따라서 객체로 행세할 수 있으며 둘 다 메시지를 수신할 수 있으므로 어떤 것이 어떤 것인지 결정하기가 어렵습니다.이것이 제가 일관된 결과를 얻을 수 있었던 유일한 방법인 것 같습니다.
편집:
다음은 수표의 원래 예입니다.
NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObject:[NSObject class]];
[arr addObject:[NSValue class]];
[arr addObject:[NSNumber class]];
[arr addObject:[NSPredicate class]];
[arr addObject:@"not a class object"];
for (int i; i<[arr count]; i++) {
id obj = [arr objectAtIndex:i];
if(class_isMetaClass(object_getClass(obj)))
{
//do sth
NSLog(@"Class: %@", obj);
}
else
{
NSLog(@"Instance: %@", obj);
}
}
[arr release];
그리고 출력:
클래스: NSObject
클래스: NSValue
클래스: NSNumber
클래스: NS 술어
인스턴스: 클래스 개체가 아님
업데이트: iOS 8+ 또는 OS X 10.10+에서는 다음 작업을 수행할 수 있습니다.
object_isClass(obj)
(필요할 것입니다.#import <objc/runtime.h>
.)
조의 대답은 좋습니다.대부분의 상황에서 작동하는 간단한 대안은 개체가 응답하여 자신을 반환하는지 확인하는 것입니다.class
.
if ([obj class] == obj) { … }
이것은 효과가 있습니다.NSObject
메타 클래스 재정의class
클래스 개체(자체)를 반환합니다. NSObject Class Reference를 참조하십시오.런타임 헤더가 필요하지는 않지만 개체가 다음의 하위 클래스라고 가정합니다.NSObject
그리고 오버라이드 하지 마세요.-class
아니면+class
특이한 일을 할 겁니다
질문의 입력을 사용하면 결과는 Joe의 결과와 동일합니다.
NSMutableArray *arr = [[NSMutableArray alloc] init];
[arr addObject:[NSObject class]];
[arr addObject:[NSValue class]];
[arr addObject:[NSNumber class]];
[arr addObject:[NSPredicate class]];
[arr addObject:@"not a class object"];
for (id<NSObject> obj in arr) {
if ([obj class] == obj) {
NSLog(@"Class: %@", obj);
}
else {
NSLog(@"Instance: %@", obj);
}
}
클래스: NSObject
클래스: NSValue
클래스: NSNumber
클래스: NS 술어
인스턴스: 클래스 개체가 아님
배열의 개체가 다음 개체인지 확인해야 하는 경우Class
object 그러면 클래스 메소드에 응답하는지 확인할 수 있습니다.
for ( id obj in arr ) {
if (([obj respondsToSelector:@selector(isSubclassOfClass:)])
&& (obj == [NSObject class]) ) {
NSLog(@"%@", obj);
}
}
일단 당신이 그것이 a라는 것을 알게되면.Class
개체가 응답하는지 확인하여 개체isSubclassOfClass:
그러면 당신은 당신과 직접적인 동등함을 확인할 수 있습니다.[NSObject class]
.
문제될 것이 없습니다.
if([NSStringFromClass([obj class]) isEqualToString:@"Class"]){
NSLog(@"It is type of Class");
}
편집
또는 Class가 프로토콜을 준수하도록 할 수도 있습니다. 그리고 배열에서 얻은 obj가 이 프로토콜을 준수하는지 확인할 수 있습니다.
if([obj conformsToProtocol:@protocol(MyClassProtocol)])
편집
또는 배열에서 가져온 것이 NSObjectComplement인지 확인할 수 있습니다.
if ([object conformsToProtocol:@protocol(NSObject)]) {
// Do something
}
언급URL : https://stackoverflow.com/questions/6536244/check-if-object-is-class-type
'IT' 카테고리의 다른 글
각진 문자열에 배열제이에스 앤 로다시 (0) | 2023.11.04 |
---|---|
XDocument를 XmlDocument로 변환하거나 그 반대의 경우 (0) | 2023.11.04 |
케이크 pp에서 아약스 요청을 확인하는 방법은? (0) | 2023.11.04 |
워드프레스:게시물의 특정 URL 자동 변경 (0) | 2023.11.04 |
어떤 컴파일러가 실행 파일을 컴파일하는 데 사용되었는지 결정하는 방법은 무엇입니까? (0) | 2023.11.04 |