Swift + 宏参数[英] Swift + macro parameters

本文是小编为大家收集整理的关于Swift + 宏参数的处理方法,想解了Swift + 宏参数的问题怎么解决?Swift + 宏参数问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

而我的实际问题是,如果我有一个宏需要在其中传递参数,那么如何以 Swift 语言传递它?

例如

Objective-C 宏

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

上述宏的Swift语法是什么?

推荐答案

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

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

本文地址:https://www.itbaoku.cn/post/924614.html