1

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

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

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

使用 4.6.3 Xcode。基础 SDK 为 5.0。我的方法可以吗?它会起作用吗?

请记住,它们是只读的,因此请不要关联对象建议。

4

3 回答 3

0

如果您简单地在类别的 .h 文件中声明该方法,您可以获得 DOT 糖语法,如下所示:

@interface CustomDataObject (additionalProperties)

-(NSString *)amount;

@end

然后您可以:

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

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

@interface CustomDataObject (additionalProperties)

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

@end

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

于 2013-07-25T15:34:22.377 回答
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

类别

#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
于 2013-07-25T14:51:04.780 回答
0

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

例如。

//getter
-(obj *)readVal{

return self._obj;
}

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

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

有关描述,请参阅此SO 答案

于 2013-07-25T14:03:02.163 回答