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

Ric*_*kiG 14 cocoa-touch objective-c nsdictionary nsobject

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

[myObject setValuesForKeysWithDictionary:JSONDict];
Run Code Online (Sandbox Code Playgroud)

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

name = name
count = count
startDate = startDate
etc..
Run Code Online (Sandbox Code Playgroud)

有没有办法走另一条路,我有一个NSDictionary,我希望"填充"来自我的NSObject子类的属性和它们的值.就像我在标题中建议的那样:

单程

MyObject *myObject = [[MyObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];
Run Code Online (Sandbox Code Playgroud)

另一种方式

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties];
Run Code Online (Sandbox Code Playgroud)

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

用字典我可以去:

[myManagedObject setValuesForKeysWithDictionary:dict];
Run Code Online (Sandbox Code Playgroud)

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

jle*_*ehr 17

是的,方法是:

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys
Run Code Online (Sandbox Code Playgroud)

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

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


Yuj*_*uji 5

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

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

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

顺便说一句,这是非常危险的为你分配一个JSON从互联网上返回一个对象来NSManagedObject使用setValuesForKeysWithDictionary:.因为,如果JSON对象恰好包含您不期望的其他键,则您的代码可能会突然崩溃.所以,不要这样做.

另一条评论:你的伪代码

NSObject *myObject = [[NSObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];
Run Code Online (Sandbox Code Playgroud)

没有多大意义:是的,你可以打电话setValuesForKeysWithDictionary:反对NSObject,但它会失败,因为你不能setValue:forKey:参加JSONDict香草的任何参赛作品NSObject.我想你知道这一点,但我想明确说明,以便遇到这个页面的新手不会被愚弄.