가정하면 우리는이 :ID가 CGRect를 가리키는 지 확인하는 방법은 무엇입니까?
id value = [self valueForKey:@"frame"];
BOOL valueIsCGRect = ???;
어떻게 결정할 수 있는가? 나는 이드를 무언가에 던져야 할까?
가정하면 우리는이 :ID가 CGRect를 가리키는 지 확인하는 방법은 무엇입니까?
id value = [self valueForKey:@"frame"];
BOOL valueIsCGRect = ???;
어떻게 결정할 수 있는가? 나는 이드를 무언가에 던져야 할까?
반환 값은 래핑 된 스칼라 유형의 인코딩 된 유형을 반환하는 objCType
메서드를 제공하는 스칼라 유형에 대해 NSValue
유형이됩니다. @encode()
을 사용하여 임의의 형식에 대한 인코딩을 가져온 다음 objCType
을 비교할 수 있습니다. 좀 더 상황과 어떤 타입 캐스팅으로
if(strcmp([value objCType], @encode(CGRect)) == 0)
{
// It's a CGRect
}
CGRect
는 struct
아닌 목표 - C 객체, 그래서 당신이 id
이있는 경우, 당신은 CGRect
이 없습니다.
아마도 당신은 NSValue
이 (가) CGRect
입니다. [value CGRectValue]
을 사용하여 CGRect
을 내보낼 수 있습니다.
frame
은 반드시 CGRect
을 반환해야하지만 실제로 확인하고 확인해야하는 경우 JustSid's answer을 사용할 수 있습니다.
:
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));
}
}
NSValues는 CG 유형에만 사용되지 않습니다. Core Media와 QTKit은 모두이를 사용합니다. –
@ 케빈 웁스, 좋은 캐치, 고마워! 비록 당신의 대답을 읽은 후에, 나는 나의 대답이 심지어 정확하게 원격인지 확실하지 않다 ... 나는 그 질문을 완전히 오해했다고 생각한다. – JustSid
나는 당신이 그가 묻는 질문에 대답했다고 생각합니다. 나는 그 문제와 근본적인 오해에 대답했습니다. – Kevin
id에 objcType 메시지를 보낼 수는 없지만 실제로는 대답 인 것 같습니다. 전에 캐스팅해야할까요? – Geri