2013-07-05 7 views
1

구조체가 특정 유형인지 어떻게 알 수 있습니까? 즉, 객체를 얻는다면, 멍청한 타입이 구조체라는 것을 어떻게 알 수 있습니까?구조체 isKindOfClass

+(BOOL)isPrimitive:(id)input 
{ 
    return [input isKindOfClass:[NSNumber class] ] || [input isKindOfClass:[NSDate class]] || [input isKindOfClass:[NSString class]] 
     || __IS_THIS_A_STRUCT__ (specifically SEL); 
} 

내가 IS_THIS_A_STRUCT의 장소에 배치해야합니까?

+1

구조체가 될 수 없습니다. 또는 당신은 그것을 정말로 잘못하고 있습니다. 'id'는 ObjC 객체에 대한 포인터 여야합니다. 그렇지 않으면 컴파일러가 경고합니다. 그러나 struct는 NSValue로 래핑 될 수 있습니다. 아마도 테스트하고자하는 것일 수 있습니다. –

+0

'SEL'은 구조체가 아니며'char *'입니다. 어떤 것이 객체인지 아닌지를 결정하는 것은 불가능할 수 있습니다. isa 포인터를 가진 구조체를 전달할 수 있고 모든 것이 잘 될 수 있기 때문에 볼 수 있습니다. – CodaFi

+0

개체를 복제하고 있으며 해당 속성 중 일부는 selector 형식입니다. 이 메소드는 선택기 (및 문자열/날짜/등)를 복제 된 객체로 전송해야합니다. 어떻게해야합니까? – user2453876

답변

1

귀하의 의견을 기반으로, 당신은 속성을 알고 구조체를 반환하는 경우 특정 방식으로 행동하고자합니다. 그래서 다음과 같은 일을 할 수있는 경우 :

if(!strcmp([[self class] 
    instanceMethodSignatureForSelector:@selector(propertyName)].methodReturnType, 
    @encode(SEL))) 

@encode는 C 문자열입니다 명명 된 유형에 대한 type encoding를 반환합니다. instanceMethodSignatureForSelector은 해당 메서드의 반환 형식을 인코딩 된 형식으로 지정할 수있는 NSMethodSignature을 반환합니다.

두 가지 유형의 인코딩은 동일한 신원을 가지지 않지만 동일한 값을 갖습니다. 따라서 C 함수 strcmp을 사용하여 동일하다는 것을 확인할 수 있습니다.

컴파일러 이름을 컴파일 할 때 알 수없는 경우 NSSelectorFromString을 사용할 수 있습니다.