4

假设我们有:

id value = [self valueForKey:@"frame"];
BOOL valueIsCGRect = ???;

我该如何决定?我应该把 id 投射到什么东西上吗?

4

3 回答 3

7

返回的值将是NSValue标量类型的类型,它提供了方法objCType,该方法返回包装的标量类型的编码类型。您可以使用@encode()获取任意类型的编码,然后比较objCType.

if(strcmp([value objCType], @encode(CGRect)) == 0)
{
   // It's a CGRect
}
于 2013-08-23T15:33:23.537 回答
4

CGRect是一个struct,而不是一个Objective-C对象,所以如果你有一个id,你就没有一个CGRect

您可能拥有的是一个NSValue包装 a CGRect。您可以CGRect使用[value CGRectValue].

frame当然应该返回 a (wrapped) CGRect,但如果你真的需要检查并确保,你可以使用JustSid 的 answer

于 2013-08-23T15:32:37.477 回答
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));
    }
}
于 2013-08-23T15:57:16.977 回答