IT

개체가 클래스 유형인지 확인합니다.

itgroup 2023. 11. 4. 10:34
반응형

개체가 클래스 유형인지 확인합니다.

나는 a를 받는 방법이 있습니다.NSArrayClass물건들과 모든 물건들이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"];

문제는.Classobjective-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 술어
인스턴스: 클래스 개체가 아님

배열의 개체가 다음 개체인지 확인해야 하는 경우Classobject 그러면 클래스 메소드에 응답하는지 확인할 수 있습니다.

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

반응형