我该如何在SWIFT中替换我之前在Objective-C中使用的 #define 宏定义?

6

我一直在使用这个Objective-C宏:

#define     RGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]

我正在尝试找出在swift中如何获得最接近的东西。有任何想法吗?


你觉得如何编写一个函数,以Swift语法创建颜色,让代码更简洁易读? - Justin Johns
4
在Swift中,苹果公司认为宏会增加调试的难度。他们建议你使用函数来替代宏。 - CrimsonChris
好的,所以不再使用宏。我明白了。谢谢你的建议。 - zumzum
3个回答

9
< p > 在 UIColor 上创建扩展是一种有效的选择。 < / p >
extension UIColor {
    convenience init(_ r: Double, _ g: Double, _ b: Double, _ a: Double) {
        self.init(red: r/255, green: g/255, blue: b/255, alpha: a)
    }
}

使用方法

let white = UIColor(255.0, 255.0, 255.0, 1.0)

这个有效,谢谢。现在其他类能看到吗?另外,为什么你在函数调用前加了“_”符号? - zumzum
3
_符号允许你调用方法时跳过参数名称。 - Gabriele Petronella
可能只是一个Swift 2.0的问题,但您需要在双精度值上添加CGFloat转换,否则您将收到一个错误,指出双精度不能转换为CGFloat。 - Pichirichi

8
在全局范围提供:
func RGBA (r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat) {
  return UIColor (red: r/255.0, green: g/255.0, blue: b/255.0, alpha: a)
}

然后可以使用以下方法:

var theColor : UIColor = RGBA (255, 255, 0, 1)

我会尝试这个。我不确定我完全理解了,你能提供完整的代码答案吗?谢谢。 - zumzum
1
是的,但请查看Apple文档中关于UIColor的内容,特别是使用Swift调用约定的init()函数。 - GoZoner
所以我添加了你建议的代码:func RGBA (r:Int, g:Int, b:Int, a:Int) -> UIColor { return UIColor(red:r/255.0,green:g/255.0,blue:b/255.0,alpha:a) } 并且还添加了返回类型 -> UIColor。编译器报错说:“无法找到接受提供的参数的'/'的重载。UIColor中的初始化程序不能使用Int,因此我将“Int”更改为“CGFloat”,然后它就可以工作了。我会将@Gabriele Petronella的答案标记为正确,因为它按原样工作。谢谢。 - zumzum

0
我所做的是创建一个类方法,该方法返回 #define。
例如:
.h 文件:
#define     RGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]
+ (UIColor*)RGBA:(CGFloat)r g:(CGFloat)g b:(CGFloat)b a:(CGFloat)a;

.m文件

+ (UIColor*)RGBA:(CGFloat)r g:(CGFloat)g b:(CGFloat)b a:(CGFloat)a { return RGBA(r, g, b, a); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接