微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – Swift宏参数

我在 Swift中阅读了与Macros相关的所有Q& A,我确实发现Swift中的所有东西现在都是全球性的,我是对的吗?

而我的实际问题是,如果我有一个宏需要参数传递,那我怎么能用Swift语言传递呢?

例如

Objective-C宏

#define COLOR_CODE(红色,绿色,蓝色,alpha)[UIColor colorWithRed:红色/ 255.0绿色:绿色/ 255.0蓝色:蓝色/ 255.0 alpha:alpha]

上面的宏的Swift语法是什么?

解决方法

正如提到的0O0O0O0,“编译器应该看到COLOR_CODE(0,1)并用[UIColor colorWithRed:0 / 255.0绿色:0 / 255.0蓝色:0 / 255.0 alpha:1]替换它的宏”在Swift中不存在.

C中的宏可以用于产生令人困惑的错误消息的方式:

#define IS_EQUAL_TO_ME(argument) [self isEqual: argument]

BOOL func(id argument) {
    return IS_EQUAL_TO_ME(argument);
}

// Error: Use of undeclared identifier 'self'

或破坏可读性:

#define OPEN_BLOCK {
#define CLOSE_WITH_EXIT_IF_FALSE } else { exit (0); }

if (x < 0)
OPEN_BLOCK
    return 10;
CLOSE_WITH_EXIT_IF_FALSE

对于像COLOR_CODE这样的简单情况,C的常用推荐策略是使用内联函数

NS_INLINE UIColor *ColorCode(CGFloat r,CGFloat g,CGFloat b,CGFloat a) {
    return [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a];
}

这与宏具有相同的性能,因为它将内联到相同的代码但是强类型并且不依赖于宏处理规则.此代码也直接转换为Swift:

func ColorCode(red:CGFloat,green:CGFloat,blue:CGFloat,alpha:CGFloat) -> UIColor {
    return UIColor(red: red/255,green: green/255,blue: blue/255,alpha: alpha)
}

因为“一切都是全局的”,您可以在任何文件中声明它并在同一模块中的任何其他文件中使用它.在这种情况下,由编译器来决定是否内联函数.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐