Как правильно получить доступ к переменной экземпляра класса NSMutableDictionary - PullRequest
1 голос
/ 29 апреля 2011

Итак, я ознакомился с лучшими практиками кодирования и важностью использования сеттеров / геттеров для доступа и изменения переменных экземпляра моих пользовательских классов, а не для того, чтобы сделать переменные общедоступными и получить к ним прямой доступ.

Но как это приводит к доступу к значениям внутри переменной экземпляра Mutable Dictionary?

В частности, у меня есть пользовательский класс. Этот класс имеет несколько переменных экземпляра, одной из которых является NSMutableDictionary. Для переменных экземпляра «не массива» (BOOL и т. Д.) Я понимаю, как «правильно» получить к ним доступ: использовать точечные обозначения и методы setter / getter.

Но для моей переменной NSMutableDictionary установщик / получатель просто обращается к словарю весь , верно? Итак, как из моего контроллера правильно установить / получить значения внутри словаря классов?

На самом деле, этот вопрос относится даже к коду реализации класса:

Возьмите мой удобный метод init, например:

- (id) initWithID:(int)ID
{
    if (self = [super init]) {
        [self initProcedure];
        [myData setObject:[NSNumber numberWithInt:ID] forKey:@"ID"];    
    }
    return self;
}

Я обращаюсь к переменной экземпляра "myData" напрямую, а не использую методы setter / getter. Я знаю, что это «разрешено», но, как я понимаю, это не лучший способ. Но как мне использовать сеттер / геттер для значений в словаре?

И затем, возвращаясь к тому, с чего мы начали, как мне сделать это вне реализации класса, например, из моего контроллера?

Для моих простых переменных экземпляра класса это просто myClassInstance.aClassVariable = someValue

Но что, если я хочу что-то изменить внутри "myData"?

Я делаю что-то вроде [myclassInstance.myData setObject:... forKey:...] (я знаю, что это не правильно, я просто пытаюсь прояснить свой вопрос / замешательство.

Полагаю, я могу создать собственные методы класса, которые я вызываю из контроллера, например [myclassInstance editMyDataWithObject:... forKey:...]

Но это кажется громоздким и все же возвращает нас к вопросу о реализации внутри самого класса и о том, как правильно использовать метод setter / getter для доступа к переменным-членам словаря вместо прямой модификации самого словаря.

Извините за длину, надеюсь, мой вопрос ясен. Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 апреля 2011

Вы можете определить динамические свойства для доступа к переменным на основе словаря:

@interface MyClass : NSObject
{
    NSMutableDictionary *myData;
}

@property (nonatomic, retain) NSNumber myProperty;

@end

@implementation MyClass
@dynamic myProperty;

- (NSNumber) myProperty {
    return [myData objectForKey: @"myProperty"]: 
}

- (void) setMyProperty(NSNumber *value) {
    [myData setObject: value forKey: @"myProperty"]: 
}
@end

для каждой переменной, хранящейся в словаре, вы можете предоставить ее содержимое с динамическим свойством, не раскрывая сам словарь.Со стороны, если бы казалось, что у класса есть свойства, поддерживающие точечный синтаксис.

0 голосов
/ 29 апреля 2011

Если вам нужно знать, когда ваша внутренняя коллекция видоизменяется, или просто хотите контролировать мутации, тогда вы должны выставить свойство как неизменяемое и добавить методы мутации в свой класс, как вы описали выше.(Я не считаю это громоздким)

[myclassInstance editMyDataWithObject:... forKey:...]

Создайте метод для каждого типа мутации, который вы хотели бы поддерживать внутри myclassInstance, например, заменить, удалить, вставить и т. Д.

Вытеперь контролируйте все мутации и не позволяйте никаким внешним классам вносить изменения без вашего ведома.

@interface MyClass : NSObject
{
    NSMutableDictionary *myData;
}

@property(readonly) NSDictionary *myData;

@end

@implementation MyClass
@dynamic myData;

- (id) initWithID:(int)ID
{
    if (self = [super init]) {
        [self initProcedure];
        [myData setObject:[NSNumber numberWithInt:ID] forKey:@"ID"];    
    }
    return self;
}

-(NSArray*)myData
{
    return [[myData copy] autorelease];
}

...

//All mutation methods

@end
...