所以我一直在阅读编码最佳实践,以及使用setter / getters访问和更改自定义类的实例变量的重要性,而不是将变量公开并直接访问它们。
但是如何转换为访问Mutable Dictionary实例变量中的值?
具体来说,我有一个自定义类。该类有许多实例变量,其中一个是NSMutableDictionary。对于“非数组”实例变量(BOOL等),我理解如何“正确”访问它们:使用点表示法和setter / getter方法。
但对于我的NSMutableDictionary变量,setter / getter只是访问整个字典,对吧?那么,从我的控制器,如何正确设置/获取里面的类字典?
实际上,这个问题甚至适用于类实现的代码:
采用我的方便init方法,例如:
- (id) initWithID:(int)ID
{
if (self = [super init]) {
[self initProcedure];
[myData setObject:[NSNumber numberWithInt:ID] forKey:@"ID"];
}
return self;
}
我直接访问实例变量“myData”,而不是使用setter / getter方法。我知道这是“允许的”,但据我所知,这不是最好的方式。但是如何在字典中使用setter / getters作为值?
然后,回到我们开始的地方,我如何从类实现之外,从我的Controller那里做到这一点?
对于我的简单类实例变量,它只是myClassInstance.aClassVariable = someValue
但如果我想修改“myData”中的内容怎么办?
我是否会做[myclassInstance.myData setObject:... forKey:...]
之类的事情(我知道这不正确,我只是想让我的问题/疑惑清楚。
我想我可以创建我在控制器中调用的自定义类方法,例如[myclassInstance editMyDataWithObject:... forKey:...]
但这看起来很笨重,仍然让我们回到类本身内部的实现问题,以及如何正确使用setter / getter技术来访问字典的成员变量,而不是直接修改字典本身。
抱歉这个长度,希望我的问题很清楚。谢谢!
答案 0 :(得分:0)
如果您需要知道内部集合何时发生变异或只想控制突变,那么您应该将该属性公开为不可变的,并将变异方法添加到您的类中,如上所述。 (我不认为这个笨重)
[myclassInstance editMyDataWithObject:... forKey:...]
为myclassInstance
中要支持的每种类型的突变创建一个方法,例如replace,remove,insert等。
您现在可以控制所有突变,并且不允许任何外部类别在您不知情的情况下进行更改。
@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
答案 1 :(得分:0)
您可以定义动态属性以访问基于字典的变量:
@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
对于字典中保存的每个变量,您可以使用动态属性公开其内容,而不会暴露字典本身。从外面看,如果觉得这个类有点语法功能。