如何声明常量

时间:2012-11-05 15:11:18

标签: objective-c if-statement

我正在稳定地掌握Objective-C,但我仍然是一个初学者并且有一个初学者级别的问题,希望有人可以阐明:

如果我有一个非常简单的项目,并希望设置一个我将在整个过程中使用的常量,比如一个NSDictionary,其中键是月份名称,值是该月份的天数 - 这是如何完成的? (即,什么命令形式和放在哪里?)

注意:如果使用内置函数已经可以使用此示例,我们可能只是假装它不是出于此问题的目的;)

4 个答案:

答案 0 :(得分:19)

答案取决于你常数的类型。如果您只需要intdouble,则可以使用预处理器和#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