Objective c 如何声明常量

Objective c 如何声明常量,objective-c,if-statement,Objective C,If Statement,我正在稳步掌握Objective-C的诀窍,但我仍然是一名初学者,有一个初级问题,希望有人能解释一下: 如果我有一个非常简单的项目,并且想要设置一个常数,我将在整个过程中使用它,比如说,一个NSDictionary,其中键是月份名称,值是该月份的天数,这是如何做到的?(即,什么样的命令形式和放在哪里?) 注意:如果这个例子已经可以使用内置函数,那么我们可以假设它不是为了这个问题;) 如果常数是字符串,则可以使用以下形式: MyObject.h: extern NSString *const kJ

我正在稳步掌握Objective-C的诀窍,但我仍然是一名初学者,有一个初级问题,希望有人能解释一下:

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


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

如果常数是字符串,则可以使用以下形式:

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

答案取决于常量的类型。如果只需要
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"];

假设您希望在类中声明一个NSString常量,该常量包含url。在header.h文件中,您需要以下内容:

#import 

extern NSString * const BaseURL;

@interface ClassName : NSObject {
然后,您需要在main.m文件中设置它的值,如下所示:

#import "ClassName.h"

NSString * const BaseURL = @"http://some.url.com/path/";

@implementation ClassName
现在,您可以在整个类或子类中访问该常量。下面是一个用法示例:

NSString *urlString = [NSString stringWithFormat:@"%@%@", BaseURL, @"filename.html"];

公认的答案是正确的,但如果您更喜欢使用变量(而不是槽法)操作,则答案是正确的。我可以建议这种模式:

@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
至于我,看起来好多了



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

但是,对于支持以文字表示的对象,
#define
可以工作…例如,字符串,甚至:
#define REFERENCE_DICTIONARY@{key1:@“value1”,“key2:@“value2”
。问题是它的评估频率与单例的设置开销相比有多高。@PhillipMills确实如此。然而,我避免提出这一点,因为这种方法效率低下:)谢谢你的解释和例子。您认为这种方法相对于extern/const答案的优势是什么?@Rogare如果您使用
extern
,您需要在某个时候调用初始化函数,除非可以在不使用任何代码的情况下执行初始化(这对于
NSDictionary
)。
dispatch\u once
方法非常常见,并且可以立即识别,它对初始化发生的时间/地点没有疑问。好的,我明白了。因此,对于C原语
#define
起作用,对于不需要初始化功能的Obj-C类,我可以使用
extern
const
,对于需要初始化的Obj-C类(如我的NSDictionary),
dispatch\u once
方法是一种可行的方法。谢谢,非常有帮助!