2013-08-23 3 views

답변

6

반환 값은 래핑 된 스칼라 유형의 인코딩 된 유형을 반환하는 objCType 메서드를 제공하는 스칼라 유형에 대해 NSValue 유형이됩니다. @encode()을 사용하여 임의의 형식에 대한 인코딩을 가져온 다음 objCType을 비교할 수 있습니다. 좀 더 상황과 어떤 타입 캐스팅으로

if(strcmp([value objCType], @encode(CGRect)) == 0) 
{ 
    // It's a CGRect 
} 
+0

@ 케빈 웁스, 좋은 캐치, 고마워! 비록 당신의 대답을 읽은 후에, 나는 나의 대답이 심지어 정확하게 원격인지 확실하지 않다 ... 나는 그 질문을 완전히 오해했다고 생각한다. – JustSid

+0

나는 당신이 그가 묻는 질문에 대답했다고 생각합니다. 나는 그 문제와 근본적인 오해에 대답했습니다. – Kevin

+0

id에 objcType 메시지를 보낼 수는 없지만 실제로는 대답 인 것 같습니다. 전에 캐스팅해야할까요? – Geri

4

CGRectstruct 아닌 목표 - C 객체, 그래서 당신이 id이있는 경우, 당신은 CGRect이 없습니다.

아마도 당신은 NSValue이 (가) CGRect입니다. [value CGRectValue]을 사용하여 CGRect을 내보낼 수 있습니다.

frame은 반드시 CGRect을 반환해야하지만 실제로 확인하고 확인해야하는 경우 JustSid's answer을 사용할 수 있습니다.

+0

그것은 실제로 NSRect를 보여줍니다 때 단순히 NSLog ("%의 @", 값 @),하지 NSValue. – Geri

+0

@ 게리 그건 반환 값이'NSValue'의 서브 클래스 인'NSConcreteValue' 타입이기 때문입니다. 여전히 NSValue입니다. – JustSid

+0

확인해 보겠습니다. – Geri

2

:

id value = [self valueForKeyPath:keyPath]; 

//Core Graphics types. 
if ([value isKindOfClass:[NSValue class]]) 
{ 
    //CGRect. 
    if(strcmp([(NSValue*)value objCType], @encode(CGRect)) == 0) 
    { 
     //Get actual CGRect value. 
     CGRect rectValue; 
     [(NSValue*)value getValue:&rectValue]; 

     NSLog(@"%@", NSStringFromCGRect(rectValue)); 
    } 

    //CGPoint. 
    if(strcmp([(NSValue*)value objCType], @encode(CGPoint)) == 0) 
    { 
     //Get actual CGPoint value. 
     CGPoint pointValue; 
     [(NSValue*)value getValue:&pointValue]; 

     NSLog(@"%@", NSStringFromCGPoint(pointValue)); 
    } 
} 
+0

NSValues는 CG 유형에만 사용되지 않습니다. Core Media와 QTKit은 모두이를 사용합니다. –