是否存在反向的“setValuesForKeysWithDictionary” - 一个makeDictionaryWithObjectProperties?

时间:2010-09-14 18:16:07

标签: objective-c cocoa-touch nsdictionary nsobject

我从Web服务解析一些JSON,这给了我一个NSDictionary,我使用这个字典来填充NSObject类型的v​​alueEntity上的属性

[myObject setValuesForKeysWithDictionary:JSONDict];

(myObject与JSON解析器中的字典具有相同的属性名称和类型)

name = name
count = count
startDate = startDate
etc..

有没有办法走另一条路,我有一个NSDictionary,我希望“填充”来自我的NSObject子类的属性及其值。 就像我在标题中所建议的那样:

单向

MyObject *myObject = [[MyObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];

反过来

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties];

这样做的原因是我有一个valueEntity,根据协议,我的视图都符合,但我也希望用值填充NSManagedObject。所以我认为使用NSDictionary作为中间步骤我可以在我的NSManagedObject上做一个类别,它从我的对象子类NSObject上的值手动设置每个属性。

我可以使用字典:

[myManagedObject setValuesForKeysWithDictionary:dict];

一旦完成上述操作,我就无法将字典表示恢复出去了吗?

3 个答案:

答案 0 :(得分:17)

是的,方法是:

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys

传入表示您感兴趣的对象属性的键数组,并返回包含属性值的字典。

NSKeyValueCoding协议定义了许多强大且非常有用的方法;熟悉它是件好事。

http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

还有一个非常有价值的伴侣指南:

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html#//apple_ref/doc/uid/10000107i

答案 1 :(得分:5)

你真的想要获得所有的财产吗?通常将对象的所有属性都作为字典获取是没有意义的。例如,如果NSManagedObject包含关系,您是否也想在字典中获取它?如果是这样,你想如何表现它?

正如jlehr所说,最好使用dictionaryWithValuesForKeys:明确地提供一组密钥。

也就是说,使用可怕的Objective-C运行时,您确实可以实现makeDictionaryWithObjectProperties。使用class_getPropertyListproperty_getName。我不会详细说明如何做到这一点,因为如果你遵循这种方法,你就会知道你在做什么。

顺便说一下,使用JSON将从互联网返回的NSManagedObject对象分配给setValuesForKeysWithDictionary:非常危险。因为,如果JSON对象碰巧包含您不期望的附加键,则您的代码可能会突然崩溃。所以,不要这样做

另一条评论:你的伪代码

NSObject *myObject = [[NSObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];

没有多大意义:是的,您可以针对setValuesForKeysWithDictionary:致电NSObject,但它会失败,因为您setValue:forKey:无法JSONDict NSObject 1}}到香草{{1}}。我想你知道这一点,但我想明确说明,以便遇到这个页面的新手不会被愚弄。

答案 2 :(得分:1)

This guy here使用了一些运行时魔法来获取对象上声明的所有属性并获取字典而无需手动提供属性名称。

而且我发现这个nice github repo,他们几乎都做同样的伎俩,但是在一个很好的包装中。它们还能够从对象创建json或plist。