Objective C定义UIColor常量

fut*_*te7 28 c iphone constants objective-c globals

我有一个iPhone应用程序,我的主题有一些自定义颜色.由于这些颜色将为我的UI修复,我想定义要包含的类中的颜色(Constants.h和Constants.m).我怎么做?(简单地定义它们不起作用,因为UIColors是可变的,并且会导致错误 - Initalizer不是恒定的).

/* Constants.h */
extern UIColor *test;

/* Constants.m */
UIColor *test = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
Run Code Online (Sandbox Code Playgroud)

谢谢!

dra*_*ard 47

UIColor不可变.我通常用颜色,字体和图像来做这件事.您可以轻松地修改它以使用单例或具有静态初始化程序.

@interface UIColor (MyProject)

+(UIColor *) colorForSomePurpose;

@end

@implementation UIColor (MyProject)

+(UIColor *) colorForSomePurpose { return [UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]; }

@end
Run Code Online (Sandbox Code Playgroud)

  • Mutable意味着您可以更改实例.不可变意味着您无法更改实例.常量意味着无法更改实例.UIColor不是可变的,也不是常数.只有CFString/NSString具有真正的常量实例,因为它们是由编译器专门作为语言的一部分处理的. (5认同)

Fat*_*lsa 31

为简单起见,我做了这个:

/* Constants.h */
#define myColor [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0]
Run Code Online (Sandbox Code Playgroud)

不要忘记遗漏';' 所以你可以将它用作普通表达式.

我不确定这种方法在技术上是否存在任何问题,但它工作正常,并且避免了编译时常量初始化程序错误 - 这个代码实际上卡在了"myColor"的任何位置,所以它永远不会得到编译,直到你实际使用它.

  • 它是一个预处理器宏.实际上'myColor'在代码中出现的地方被替换为完整的'[UIColor colorWith ...'代码行,在它编译之前.你遗漏了';' 在宏中,所以你可以使用这样的代码:`UIColor*color = myColor;`而不是`UIColor*color = myColor`,它看起来不像正常的代码行(在分号处放置分号更自然任何代码行的结尾).它可以省略,因为预处理器宏在使用时会按原样进行评估,因此只要在实际代码中放置分号,就可以了. (2认同)
  • 但是,每次使用此宏时,这不会创建此颜色的新实例吗?考虑将其置于具有1000次迭代的for循环中,并将其指定为视图的背景颜色.这不是很有效吗? (2认同)

yea*_*xon 14

另外一个选项

在你的.h你可以做到

extern UIColor *  const COLOR_LIGHT_BLUE;
Run Code Online (Sandbox Code Playgroud)

在你的mm中,你可以做到

UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255  blue:1 alpha:1];//;#15B4FF
Run Code Online (Sandbox Code Playgroud)

  • 什么是这个狡猾的C++动态常量?;)+1 (3认同)

Ami*_*itP 5

如果您正在寻找没有扩展名的快速而肮脏的程序,请使用clang

#define kGreenColor colorWithRed:(0/255.0) green:(213/255.0) blue:(90/255.0) alpha:1.0

- (void)doSomething
{
   _label.textColor = [UIColor kGreenColor];

}
Run Code Online (Sandbox Code Playgroud)