加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Objective-C安全铸造宏

发布时间:2020-12-16 05:50:50 所属栏目:百科 来源:网络整理
导读:我在Objective-C中编写了一个宏来执行安全转换.这是迄今为止的样子: #define SAFE_CAST(OBJECT,TYPE) ([OBJECT isKindOfClass:[TYPE class]] ? (TYPE *) OBJECT: nil) 这非常有效,但是如果有一种方法可以将OBJECT存储在一个变量中,那么它就不会被调用两次.
我在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读