在 Objective-C 中使用 C++ 作为常量有什么缺点吗?

is there any disadvantage using c++ for constants in objective-c

本文关键字:常量 什么 缺点 Objective-C C++      更新时间:2023-10-16
//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++ 一无所知,我没有看到有人这样做(?

在我看来有两个缺点:

1. 初始化顺序

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

2. 目标C++本身

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

肯定有一些情况下,使用Objective-C++是值得的,但我不会仅仅为了方便而使用它。

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

你应该注意的怪癖:目标-C之神的愤怒,以及任何了解目标-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;
}