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