Objective-C安全铸造宏

前端之家收集整理的这篇文章主要介绍了Objective-C安全铸造宏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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);

谢谢.

解决方法

您可以使用名为语句 statement expressions的GCC扩展
#define SAFE_CAST(OBJECT,TYPE) ({ id obj=OBJECT;[obj isKindOfClass:[TYPE class]] ? (TYPE *) obj: nil; })

也就是说,我认为这种情况通常是一种糟糕的方法,你需要经常使用SAFE_CAST.切勿将不同类的对象放在数组中;永远不要重复使用动作消息(IBAction)someAction:(id)sender来表示不同类的UI对象.那么您通常不需要使用SAFE_CAST.

猜你在找的C&C++相关文章