Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift&x2B;宏参数_Ios_Swift_Macros_Ios8 - Fatal编程技术网

Ios Swift&x2B;宏参数

Ios Swift&x2B;宏参数,ios,swift,macros,ios8,Ios,Swift,Macros,Ios8,我在Swift中阅读了所有与宏相关的问答,我确实发现了Swift now global中的所有内容,我说得对吗? 我的实际问题是,如果我有一个宏,其中需要传递参数,那么如何才能用Swift语言传递它 e、 g Objective-C宏 #定义颜色代码(红、绿、蓝、阿尔法)[UIColor colorWithRed:red/255.0绿:绿/255.0蓝:蓝/255.0阿尔法:阿尔法] 上述宏的Swift语法是什么?您可能需要将其转换为函数或泛型,如下所示: “复杂宏在C和Objective-C中

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

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

e、 g

Objective-C宏

#定义颜色代码(红、绿、蓝、阿尔法)[UIColor colorWithRed:red/255.0绿:绿/255.0蓝:蓝/255.0阿尔法:阿尔法]


上述宏的
Swift
语法是什么?

您可能需要将其转换为函数或泛型,如下所示:


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

正如0O0O0O0所提到的,编译器应该看到
颜色代码(0,0,0,1)
并用
[uicolorWithred: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
这与宏具有相同的性能,因为它将内联到相同的代码,但它是强类型的,不依赖于宏处理规则。该代码还直接翻译为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)
}

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

我所做的是创建一个返回#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;
+ (UIColor*)colorCodeWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { return COLOR_CODE(red, green, blue, alpha); }
.m文件:

#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;
+ (UIColor*)colorCodeWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { return COLOR_CODE(red, green, blue, alpha); }
和Swift:

#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;
+ (UIColor*)colorCodeWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { return COLOR_CODE(red, green, blue, alpha); }
因为这是一个类方法,所以现在可以像#定义的那样使用它。 如果更改#define宏,它将反映在您创建的新方法中 迅速:

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


谢谢你的详细解释。你试过这个吗?它给出了一个错误
预期表达式
。复制并粘贴到
.swift
文件中。这不是swift代码-这是Objective-C代码(从.h和.m文件可以看出)。我将编辑我的答案以反映这一事实。谢谢你的努力,我也将尝试这一个。