如何检查id是否指向CGRect?

时间:2013-08-23 15:26:00

标签: ios struct core-graphics cgrect kvc

假设我们有:

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

我该如何决定?我应该把id转换成某种东西吗?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

CGRectstruct,而非Objective-C对象,因此如果您有id,则不会有CGRect

你可能拥有NSValue包裹CGRect。您可以使用[value CGRectValue]获取CGRect

frame当然应该返回(包裹)CGRect,但如果您确实需要检查并确认,则可以使用JustSid's answer

答案 2 :(得分: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));
    }
}