通过类别键的附加只读属性

时间:2013-07-25 14:00:38

标签: ios objective-c cocoa-touch

在我的项目中,我从自定义SDK传递了一个数据对象(XYZCustomClass)。我永远不需要修改这个对象,只使用它并在UI中显示它的数据。 此自定义数据对象具有5个普通字符串属性,以及名为“addditionalProperties”的NSDictionary类型属性。字典包含一组键值对。

我在客户端部分想要的是在我的自定义数据对象上拥有与这些键匹配的真实属性。基本上我想拥有一个很好的界面,一切都是不动产。我不希望在键下隐藏一些东西,而其他东西通常可以访问。

我想在这个声明的数据对象上创建一个类别 1)每个密钥的公共只读属性 2)实现getter,它将检索与特定属性相关的特定键的对象。

使用4.6.3 Xcode。基础SDK是5.0。我的方法好吗?它会起作用吗?

请记住,它们是只读的,所以请不要提供相关的对象建议。

3 个答案:

答案 0 :(得分:0)

不,您无法在类别中声明属性。 但是,您可以使用解决方法,如果属性不是只读的,您可以添加方法,这将像访问器方法一样工作:

例如

//getter
-(obj *)readVal{

return self._obj;
}

//setter
-(void) update :(obj *)_val{
self._obj=_val;
}

您可以使用关联参考。引用苹果的文档“可以直接与这个运行时系统交互,例如通过向对象添加关联引用。与类扩展不同,关联引用不会影响原始类声明和实现,这意味着您可以将它们与框架类一起使用您无法访问原始源代码。“

有关说明,请参阅此SO answer

答案 1 :(得分:0)

这没有明显的问题。这段代码中有一些问题吗?

数据对象

#import <Foundation/Foundation.h>

@interface CustomDataObject : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSDictionary *additionalProperties;

@end

 #import "CustomDataObject.h"

 @implementation CustomDataObject

- (id)init
{
    self = [super init];
    if (self)
    {
        self.name = @"FirstName LastName";

        self.additionalProperties = @{@"amount"   : @"1000",
                                      @"state"    : @"happy"};
    }
    return self;
}

@end

CATEGORY

#import "CustomDataObject.h"

@interface CustomDataObject (additionalProperties)

@property (assign, nonatomic, readonly) NSString *amount;
@property (assign, nonatomic, readonly) NSString *state;

@end

#import "CustomDataObject+additionalProperties.h"

@implementation CustomDataObject (additionalProperties)

-(NSString *)amount
{
    return [self.additionalProperties objectForKey:@"amount"];
}

-(NSString *)state
{
    return [self.additionalProperties objectForKey:@"state"];
}

@end

VIEWCONTROLLER和输出

CustomDataObject *myObject = [[CustomDataObject alloc] init];

NSLog(@"%@", myObject.name);
NSLog(@"%@", myObject.amount);
NSLog(@"%@", myObject.state);

-----

2013-07-25 15:44:01.790 CatTest[30911:c07] FirstName LastName
2013-07-25 15:44:03.487 CatTest[30911:c07] 1000
2013-07-25 15:44:03.984 CatTest[30911:c07] happy

答案 2 :(得分:0)

如果您在类别的.h文件中简单声明方法,则可以获取DOT糖语法:

@interface CustomDataObject (additionalProperties)

-(NSString *)amount;

@end

然后你可以:

NSLog(@"%@", myObject.amount);

如果您不想为字典中的每个元素声明一个方法,您可以执行以下操作:

@interface CustomDataObject (additionalProperties)

-(NSString *)additionalPropertiesKey:(NSString *)key;

@end

但是你会失去你的DOT语法,因为在这种情况下,该方法需要一个参数。