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也使用它们。