我正在稳定地掌握Objective-C,但我仍然是一个初学者并且有一个初学者级别的问题,希望有人可以阐明:
如果我有一个非常简单的项目,并希望设置一个我将在整个过程中使用的常量,比如一个NSDictionary,其中键是月份名称,值是该月份的天数 - 这是如何完成的? (即,什么命令形式和放在哪里?)
注意:如果使用内置函数已经可以使用此示例,我们可能只是假装它不是出于此问题的目的;)
答案 0 :(得分:19)
答案取决于你常数的类型。如果您只需要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"];
答案 1 :(得分:2)
接受的答案是正确的,但如果您更喜欢使用变量(非槽法)。我可以建议这种模式:
@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
至于我 - 它看起来更好。
有关详情source is here。
答案 2 :(得分:1)
假设您要在类中声明一个包含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"];
答案 3 :(得分:0)
如果你的常量是字符串,那么你可以使用这个表格:
MyObject.h:
extern NSString *const kJanuary;
....
extern NSString *const kDecember;
@interface MyObject : NSObject
{
...
}
@end
MyObject.m:
NSString *const kJanuary = @"January";
....
NSString *const kDecember = @"December";
@implementation MyObject
....
@end
然后,您可以在使用班级的任何地方使用常量kJanuary
。