如何公开声明NSDictionary的密钥?

时间:2012-01-16 18:22:44

标签: objective-c interface nsdictionary

我已经定义了一个字典,我想传递给其他各种对象。当他们收到这本词典时,他们需要知道它是如何定义的,这样他们就可以解压缩它以获得它的价值。我一直在我的公共标题中使用#define来定义键。这样,我得到编辑时编译器检查以确保我不使用bum密钥。但是有没有其他更标准的方法来声明接口到已定义的字典,以便其他对象在尝试使用未定义的键时会出现编译错误?

3 个答案:

答案 0 :(得分:3)

优于#define是使用常量NSString。在标题中:

extern NSString * const MyDictionaryFribbleKey;

(这是指向NSString的常量指针。)在您的实现中:

NSString * const MyDictonaryFribbleKey = @"theFribble";

这是框架导出常量字符串的方式。这不会停止使用无效键,没有什么能真正做到这一点(它是C,你可以绕过任何东西),但它会提高标准。

答案 1 :(得分:1)

为什么不使用对象而不是使用字典呢?

以下示例显示,实际上没有太多额外的工作。此外,您还可以获得实际使用对象的优势。

对象设置

@interface MyClass : NSObject

@property (nonatomic, strong) NSString *myString;
@property (nonatomic, assign) CGFloat myFloat;

@end

@implementation MyClass

@synthesize myString = _myString;
@synthesize myFloat  = _myFloat;

@end

对象使用

MyClass *myClass = [[MyClass alloc] init];

// Set 
myClass.myString = @"aa";
myClass.myFloat  = 12.0f;

// Get
NSString *myString = myClass.myString
CGFloat   myFloat  = myClass.myFloat;

NSDictionary设置

<强>·H

extern NSString * const MYClassKeyMyString;
extern NSString * const MYClassKeyMyFloat;

<强>的.m

NSString * const MYClassKeyMyString = @"MYClassKeyMyString";
NSString * const MYClassKeyMyFloat  = @"MYClassKeyMyFloat";

NSDictionary使用

NSDictionary *myDict = [[NSMutableDictionary alloc] init];

// Set
[myDict setObject:@"aa" forKey:MYClassKeyMyString];
[myDict setObject:[NSNumber numberWithFloat:12.0f] forKey:MYClassKeyMyFloat];

// Get
NSString *myString = [myDict objectForKey:MYClassKeyMyString];
CGFloat   myFloat  = [[myDict objectForKey:MYClassKeyMyFloat] floatValue];

答案 2 :(得分:0)

这是一种非常标准的方式。您还可以使用-enumerateKeys方法枚举字典的键。