Как проверить, указывает ли идентификатор на CGRect?
Предположим, у нас есть:
id value = [self valueForKey:@"frame"];
BOOL valueIsCGRect = ???;
Как я могу решить? Должен ли я привести удостоверение личности к чему-то?
3 ответа
Возвращаемое значение будет иметь тип NSValue
для скалярных типов, который обеспечивает метод objCType
, который возвращает закодированный тип упакованного скалярного типа. Ты можешь использовать @encode()
чтобы получить кодировку для произвольного типа, а затем сравнить objCType
,
if(strcmp([value objCType], @encode(CGRect)) == 0)
{
// It's a CGRect
}
CGRect
это struct
, а не объект Objective-C, так что если у вас есть id
, у вас нет CGRect
,
То, что у вас, вероятно, есть NSValue
обертывание CGRect
, Вы можете получить CGRect
с помощью [value CGRectValue]
,
frame
должен обязательно вернуть (завернутый) CGRect
, но если вам действительно нужно проверить и убедиться, вы можете использовать ответ JustSid.
С немного большим контекстом и некоторой типизацией:
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));
}
}