Ios 如何检查id是否指向CGRect?

Ios 如何检查id是否指向CGRect?,ios,struct,core-graphics,cgrect,kvc,Ios,Struct,Core Graphics,Cgrect,Kvc,假设我们有: id value = [self valueForKey:@"frame"]; BOOL valueIsCGRect = ???; 我怎么决定?我应该将id强制转换为某个对象吗?CGRect是一个struct,而不是Objective-C对象,因此如果您有id,您就没有CGRect 您可能有一个NSValue包装一个CGRect。您可以使用获取CGRect frame当然应该返回一个(包装的)CGRect,但是如果您确实需要检查并确保,您可以使用。对于标量类型,返回的值将是NSV

假设我们有:

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

我怎么决定?我应该将id强制转换为某个对象吗?

CGRect
是一个
struct
,而不是Objective-C对象,因此如果您有
id
,您就没有
CGRect

您可能有一个
NSValue
包装一个
CGRect
。您可以使用获取
CGRect


frame
当然应该返回一个(包装的)
CGRect
,但是如果您确实需要检查并确保,您可以使用。

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

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

再加上一点上下文和一些类型转换:

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));
    }
}

@凯文:哇,接得好,谢谢!不过,在阅读了你的答案后,我不确定我的答案是否有一点正确。。。我想我完全误解了那里的问题。我想你回答了他问的问题,我只是回答了问题和潜在的误解。这看起来确实是答案,尽管我不能向id发送objcType消息。我是否应该在。。。有什么吗?@Geri你当然可以,你只需要正确地键入它,不像我(它是
objCType
,不是
objCType
,对不起)。但是,如果您知道您将访问
frame
属性而不是任意属性,那么您也知道它返回一个
CGRect
,在这种情况下@Kevin的答案是正确的。@JustSid您不应该首先验证
value
实际上是一个
NSValue
对象吗?它实际上显示了一个NSRect,当我只是NSLog(@“%@”,value),而不是NSValue时。@Geri这是因为返回的值实际上是类型
NSConcreteValue
,是
NSValue
的子类。它仍然是一个
NSValue
。还有一个问题仍然存在-一旦你知道你有一个
NSValue
,你如何知道
NSValue
是否包含一个
CGRect
或其他值?我认为您需要查看
NSValue对象jctype
,但我不知道它对于
CGRect
来说等于什么。NSValue不仅仅用于CG类型。核心介质和QTKit也使用它们。