Swift +宏参数

时间:2014-10-08 07:54:11

标签: ios swift macros ios8

我在Swift中阅读了与宏相关的所有问答,我确实知道 everything in Swift now global, 我是对的吗?

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

e.g。

Objective-C Macro

#define COLOR_CODE(red, green, blue, alpha) [UIColor colorWithRed: red/255.0 green: green/255.0 blue: blue/255.0 alpha: alpha]

上述宏的Swift语法是什么?

3 个答案:

答案 0 :(得分:3)

正如提到的0O0O0O0,“编译器应该看到COLOR_CODE(0, 0, 0, 1)并将其替换为[UIColor colorWithRed: 0/255.0 green: 0/255.0 blue: 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)
}

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

答案 1 :(得分:2)

根据this documentation page

,您可能需要将其转换为函数或泛型函数

“复杂的宏在C和Objective-C中使用但在Swift中没有对应物。复杂的宏是不定义常量的宏,包括带括号的,类似函数的宏。你使用复杂的宏在C和Objective-C中避免类型检查约束或避免重新输入大量的样板代码。然而,宏可能使调试和重构变得困难。在Swift中,您可以使用函数和泛型来实现相同的结果而不会有任何妥协。因此,C和Objective-C源文件中的复杂宏不可用于Swift代码。“

答案 2 :(得分:2)

我所做的是创建一个返回#define的类方法。

示例:

.h文件:

#define COLOR_CODE(red, green, blue, alpha) [UIColor colorWithRed: red/255.0 green: green/255.0 blue: blue/255.0 alpha: alpha]
+ (UIColor*)colorCodeWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

.m文件:

+ (UIColor*)colorCodeWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { return COLOR_CODE(red, green, blue, alpha); }

在Swift中:

由于这是一种类方法,您现在可以像使用#define一样使用它。 如果更改#define宏 - 它将反映在您创建的新方法中 在斯威夫特:

  

让color = YourClass.colorCodeWithRed(72.0,绿色:55.0,蓝色:100.0,alpha:1.0);