4
//header-file
#import <Foundation/Foundation.h>
extern UIColor *const COLOR_BACKGROUND;

//implementation-file
#import "Constants.h"
UIColor *const COLOR_BACKGROUND= [UIColor greenColor];

如果你用 .m 文件尝试这个,你会得到一个错误,因为它不是编译时常量。将实现文件更改为 .mm 可以解决此问题。但是有什么我应该注意的怪癖(我对c++一无所知,而且我没有看到有人这样做)?

4

2 回答 2

2

在我看来有两个缺点:

1.初始化顺序

C++ 中静态初始化器的一个众所周知的问题是初始化顺序。在使用颜色或字体时,这可能没什么大不了的。但是一旦涉及到你自己的对象,当一个实例的构造函数访问另一个静态对象时,它很快就会变得一团糟。

2. Objective-C++ 本身

如果你使用这种风格,你就会被绑定到 Objective-C++。与其他开发人员一起工作或使用其他地方的代码时,不使用(纯)Objective-C 会很尴尬且容易出错。两种语言之间有很多细微的差异,其中许多会咬你一口,特别是如果你对这两种语言都不是很熟悉的话。

在某些情况下使用 Objective-C++ 是值得的,但我不会为了方便而使用它。

于 2013-07-08T14:31:17.350 回答
1

反对这一点的论点将基于风格。从功能上讲,它会像您期望的那样工作,并且存在的陷阱与您编写纯 C++ 代码时的陷阱相同......

你应该知道的怪癖:Objective-C 诸神的愤怒,以及任何了解 Objective-C 的上司。

我可以推荐 [CIColor colorWithString:(NSString *)],并将您的常量颜色存储为 NSString 作为 Objective-C 完成您希望完成的方式的方式。请注意,UIColor 类有一个 initWithCIColor 方法。您可以使用这行逻辑来创建 UIColors 的局部常量变量,并安抚 Objective-C 霸主。

像这样:

//.h
extern NSString *const COLOR_STRING;

//.m
NSString *const COLOR_STRING = @"SOME_COLOR";

@implementation ModalDelegate

- (id)init
{
    CIColor *const MY_COLOR = [CIColor colorWithString:COLOR_STRING];//Can easily be made a UIColor instead, though unfortunately there is no "UIColor fromString" method.
    self = [super init];    
    return self;
}
于 2013-07-08T14:01:28.867 回答