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