【问题标题】:How to Properly Access a Class NSMutableDictionary Instance Variable如何正确访问类 NSMutableDictionary 实例变量
【发布时间】:2011-04-29 18:37:27
【问题描述】:

所以我一直在阅读编码最佳实践,以及使用 setter/getter 访问和更改自定义类的实例变量的重要性,而不是公开变量并直接访问它们。

但这如何转化为访问可变字典实例变量中的值?

具体来说,我有一个自定义类。该类有许多实例变量,其中一个是 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/getter 获取字典中的值?

然后,回到我们开始的地方,我如何从类实现之外(例如,从我的控制器)执行此操作?

对于我的简单类实例变量,它只是myClassInstance.aClassVariable = someValue

但是如果我想修改“myData”中的某些内容呢?

我会做类似[myclassInstance.myData setObject:... forKey:...] 的事情吗(我知道这不正确,我只是想弄清楚我的问题/困惑。

我想我可以创建从控制器中调用的自定义类方法,例如 [myclassInstance editMyDataWithObject:... forKey:...]

但这似乎很庞大,并且仍然让我们回到类本身的实现问题,以及如何正确使用 setter/getter 技术来访问字典的成员变量,而不是直接修改字典本身。

抱歉冗长,希望我的问题很清楚。谢谢!

【问题讨论】:

  • 在您的问题中添加 [self initProcedure] 的代码和您在头文件中编写的 myData 的 @property 行。

标签: iphone objective-c nsmutabledictionary getter-setter


【解决方案1】:

您可以定义动态属性来访问基于字典的变量:

@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

对于字典中保存的每个变量,您可以使用动态属性公开其内容,而不公开字典本身。从外面看,如果觉得这个类有支持点语法的属性。

【讨论】:

    【解决方案2】:

    如果您需要知道您的内部集合何时发生变异,或者只是想控制变异,那么您应该将该属性公开为不可变的,并如上所述向您的类添加变异方法。 (我不认为这很笨重)

    [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
    

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 2012-03-22
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多