在一个简单的项目中,我想设置一个将在整个项目中使用的常量。
例如,
NSDictionary
,键是月份名称,值是该月的天数。
如何做到这一点? (即语法是什么以及将其放在哪里?)如果使用内置函数已经可以使用此示例,则假装它不适合此问题的目的。
答案取决于常量的类型。如果您需要的只是
int
或 double
,您可以使用预处理器和 #define CONST 123
语法。然而,对于 Objective C 类,您需要做更多的工作。
具体来说,您需要将常量隐藏在类方法或独立函数后面。您还需要在头文件中添加该方法或函数的原型,提供函数范围的静态变量来存储常量,并添加代码来初始化它。
这是一个使用简单
NSDictionary
的示例:
标头:MyConstants.h
@interface MyConstants
+(NSDictionary*)getConstDictionary;
@end
实现:MyConstants.m
+(NSDictionary*)getConstDictionary {
static NSDictionary *inst = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
inst = @{
@"key1": @"value1",
@"key2": @"value2",
@"key3": @"value3"
};
});
return inst;
}
用途:
NSString *val = [[MyConstants getConstDictionary] objectForKey:@"key2"];
接受的答案是正确的,但是如果您更喜欢使用变量(而不是槽方法)进行操作。我可以建议这种模式:
@implementation MyClass
static NSSet *mySetOfObjects;
+ (void)initialize {
mySetOfObjects = [[NSSet alloc] initWithObjects:@"one", @"two", @"three", nil];
}
// Example usage:
+ (BOOL)isRecognizedString:(NSString *)searchItem {
return [mySetOfObjects containsObject:searchItem];
}
@end
对于我来说 - 看起来更好。
有关更多详细信息,来源在这里。
假设您想在类中声明一个包含 url 的 NSString 常量。在您的头 .h 文件中,您将需要以下内容:
#import
extern NSString * const BaseURL;
@interface ClassName : NSObject {
然后,您需要在主 .m 文件中设置它的值,如下所示:
#import "ClassName.h"
NSString * const BaseURL = @"http://some.url.com/path/";
@implementation ClassName
您现在可以在整个类或子类中访问此常量。这是一个使用示例:
NSString *urlString = [NSString stringWithFormat:@"%@%@", BaseURL, @"filename.html"];
如果你的常量是字符串,那么你可以使用这种形式:
MyObject.h:
extern NSString *const kJanuary;
....
extern NSString *const kDecember;
@interface MyObject : NSObject
{
...
}
@end
我的对象.m:
NSString *const kJanuary = @"January";
....
NSString *const kDecember = @"December";
@implementation MyObject
....
@end
然后,您可以在使用类时从任何地方使用常量
kJanuary
。