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

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...