我是目标C(来自Java世界)的新手。
我正在尝试创建一个常量头文件,该文件允许类使用静态常量、静态Enum和静态字典。
这是Constants.h的伪代码
extern NSString* const WelcomeMessage;
typedef enum {
RED,
GREEN,
ORANGE
} Color;
//Use the above Color Enum values as keys to map each color to a message String.
NSDictionary *colorMapper= [NSDictionary dictionaryWithObjectsAndKeys:
RED, @"Excellent choice. Red is the color of love",
GREEN, @"Can't go wrong with Green. Green is associated with Nature",
ORANGE, @"The color is as sweet as a juicy Floridian Orange"
];Constants.m
...
- (void)printColor:(Color) color
{
NSLog(@"%@", [colorMapper objectForKey:color]);
}我正在试图找出如何正确地声明静态常量、静态Enum和带有键的静态字典(如Color Enum和String类型的值)。这是可行的(静态Enum和Enum作为键的字典是否允许)?如果不是,是否有实现此行为的其他方法?
发布于 2018-04-21 07:29:14
所有输入到答案中的代码,预期输入错误。
C对在常量初始化中可以使用的表达式和类型有限制;这些限制包括原语类型(整数、字符等)、字符串(包括C和NSString),但不包括NSDictionary值。
但是,对于Objective,在加载包含代码的二进制文件(应用程序或框架)时会调用+load方法。此方法在任何+initialize方法之前运行。用它你可以实现你想要的,从你的Constants.h开始
extern NSString * const WelcomeMessage;
typedef enum {
RED,
GREEN,
ORANGE
} Color;
extern NSDictionary * colorMapper;在您的Constants.m中定义一个类,以包含用于初始化NSDictionary的+load
#import "Constants.h"
NSString * const WelcomeMessage = @"...";
NSDictionary * colorMapper;
// pick a hard to type name...
@interface Private_Hidden_Class_To_Init_Dictionary_
@end
@class Private_Hidden_Class_To_Init_Dictionary_
+ (void) load // will execute automatically when this file is loaded
{
colorMapper =
@{ @(RED) : @"Excellent choice. Red is the color of love",
@(GREEN) : @"Can't go wrong with Green. Green is associated with Nature",
@(ORANGE) : @"The color is as sweet as a juicy Floridian Orange"
};
}
@end这段代码对字典使用了@{ ... } Objective字面语法。还请注意,与代码中的键不同,使用@(RED)等作为键。NSDictionary的键必须是对象,@(RED)是一个对象-C文字,它生成一个NSNumber类型的对象。
(注意:可能有一个属性可以附加到C函数中,使它具有相同的运行时加载语义,但是我没有在Clang文档中找到其中的一个。使用C函数将消除对类的需求。)
HTH
https://stackoverflow.com/questions/49947448
复制相似问题