Objective C безопасный макрос кастинга

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

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

Это работает действительно хорошо, но было бы хорошо, если бы был способ хранить ОБЪЕКТ в переменной, таким образом, это не стало названным дважды. Например, с помощью макроса как такового:

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);

Спасибо.

6
задан LandonSchropp 13 July 2010 в 02:27
поделиться

3 ответа

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

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

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

10
ответ дан 8 December 2019 в 17:18
поделиться

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

#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;
}
4
ответ дан 8 December 2019 в 17:18
поделиться

Так и напишите, только оберните это в do { } while(0) <-- и не только в круглые скобки.

#define SAFE_CAST(OBJECT, TYPE, VAR) do { \
    id obj = OBJECT; \
    VAR = [obj isKindOfClass:[TYPE class]] ? (TYPE *) obj : nil; \
} while(0)
0
ответ дан 8 December 2019 в 17:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: