Как я публично объявляю ключи к NSDictionary? - PullRequest
1 голос
/ 16 января 2012

Я определил словарь, который я хотел бы передать различным другим объектам.Когда они получают этот словарь, им нужно знать, как он определен, чтобы они могли распаковать его, чтобы получить его значения.Я использовал # define в своем публичном заголовке для определения ключей.Таким образом, я получаю проверку компилятора во время редактирования, чтобы убедиться, что я не использую клавишу bum.Но существует ли какой-либо другой, более стандартный способ объявления интерфейса в определенном словаре, чтобы другие объекты получали ошибки компиляции, если они пытаются использовать неопределенные ключи?

Ответы [ 3 ]

3 голосов
/ 16 января 2012

Лучше #define использовать постоянные NSString с. В вашей шапке:

extern NSString * const MyDictionaryFribbleKey;

(это постоянный указатель на NSString.) И в вашей реализации:

NSString * const MyDictonaryFribbleKey = @"theFribble";

Вот как фреймворки экспортируют константные строки. Это не остановит использование недействительных ключей, ничего не поделаешь (это C, вы можете обойти что угодно), но это поднимает планку выше.

1 голос
/ 17 января 2012

Вместо использования словаря, почему бы не использовать объект?

Пример ниже показывает, что на самом деле не так много дополнительной работы.Кроме того, вы получаете преимущества фактического использования объектов.

Настройка объекта

@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;

Набор NSDictionaryup

.h

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

.m

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

NSDictionary use

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];
0 голосов
/ 16 января 2012

Это довольно стандартный способ.Вы также можете перечислить ключи словаря, используя метод -enumerateKeys.

...