Как проверить, указывает ли идентификатор на 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));
    }
}
Другие вопросы по тегам