Objective-C Safe Casting Macro - PullRequest
       3

Objective-C Safe Casting Macro

6 голосов
/ 13 июля 2010

Я написал макрос в Objective-C для безопасного выполнения.Вот как это выглядит до сих пор:

#define SAFE_CAST(OBJECT, TYPE) ([OBJECT isKindOfClass:[TYPE class]] ? (TYPE *) OBJECT: nil)

Это работает очень хорошо, но было бы неплохо, если бы был способ сохранить OBJECT в переменной, чтобы он не вызывался дважды.Например, использование макроса как такового:

NSString *str = SAFE_CAST([dictinary objectForKey:key], NSString);

приводит к коду, похожему на этот, при развертывании макроса:

NSString *str = ([[dictinary objectForKey:key] isKindOfClass:[NSString class]] ? (NSString *) [dictinary objectForKey:key]: nil);

Я бы предпочел, чтобы он работал больше так:

id obj = [dictionary objectForKey:key];
NSString *str = ([obj objectForKey:key] isKindOfClass[NSString class]] ? (NSString *) obj : nil);

Спасибо.

Ответы [ 3 ]

10 голосов
/ 13 июля 2010

Вы можете использовать расширение GCC, называемое оператором операторными выражениями , чтобы иметь

#define SAFE_CAST(OBJECT, TYPE) ({ id obj=OBJECT;[obj isKindOfClass:[TYPE class]] ? (TYPE *) obj: nil; })

Тем не менее, я думаю, что это вообще плохой подход к ситуации, когда вам нужно использовать SAFE_CAST много.Никогда не помещайте объекты разных классов в массив;никогда не используйте сообщение действия (IBAction)someAction:(id)sender для объектов пользовательского интерфейса разных классов.Тогда вам обычно не нужно использовать SAFE_CAST.

4 голосов
/ 13 июля 2010

Если вы действительно думаете, что должны это сделать, вы можете использовать функцию:

#define SAFE_CAST(Object, Type) (Type *)cast_helper(Object, [Type class])
static id cast_helper(id x, Class c) {
    return [x isKindOfClass:c] ? x : nil;
}
0 голосов
/ 13 июля 2010

Так что напишите это так, просто оберните это в do {} while (0) <- а не просто в скобках. </p>

#define SAFE_CAST(OBJECT, TYPE, VAR) do { \
    id obj = OBJECT; \
    VAR = [obj isKindOfClass:[TYPE class]] ? (TYPE *) obj : nil; \
} while(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...