假设我们有:
id value = [self valueForKey:@"frame"];
BOOL valueIsCGRect = ???;
我该如何决定?我应该把id转换成某种东西吗?
答案 0 :(得分:6)
对于标量类型,返回值的类型为NSValue
,它提供方法objCType
,它返回包装的标量类型的编码类型。您可以使用@encode()
获取任意类型的编码,然后比较objCType
。
if(strcmp([value objCType], @encode(CGRect)) == 0)
{
// It's a CGRect
}
答案 1 :(得分:4)
CGRect
是struct
,而非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));
}
}