8

我逐渐掌握了 Objective-C 的窍门,但我仍然是一个初学者,并且有一个初学者级别的问题,希望有人能对此有所了解:

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

注意: 如果这个例子已经可以使用内置函数,也许我们可以假装它不是为了这个问题的目的;)

4

4 回答 4

19

答案取决于常量的类型。如果您只需要 aint或 a 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"];
于 2012-11-05T15:18:32.210 回答
3

接受的答案是正确的,如果您更喜欢使用变量(不是槽法)进行操作。我可以建议这种模式:

@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

至于我 - 它看起来更好。


有关更多详细信息,请参见此处

于 2014-02-25T09:51:37.693 回答
2

假设您要在包含 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"];
于 2012-11-05T15:20:03.347 回答
0

如果您的常量是字符串,那么您可以使用这种形式:

我的对象.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然后,您可以在使用类时从任何地方使用常量。

于 2012-11-05T15:16:28.927 回答