Objective c 是否有一个相反的说法;设置RKEYSWITHDIctionary“的值”makeDictionaryWithObjectProperties?

Objective c 是否有一个相反的说法;设置RKEYSWITHDIctionary“的值”makeDictionaryWithObjectProperties?,objective-c,cocoa-touch,nsdictionary,nsobject,Objective C,Cocoa Touch,Nsdictionary,Nsobject,我从一个web服务解析一些JSON,这给了我一个NSDictionary,我使用这个dictionary在NSObject类型的valueEntity上填充属性 [myObject setValuesForKeysWithDictionary:JSONDict]; (myObject的属性名和类型与JSON解析器中的字典相同) 有没有另一种方法,我有一个NSDictionary,我想用我的NSObject子类中的属性及其值“填充”它。 正如我在标题中所建议的,大致如下: 单程 反过来 这样做的

我从一个web服务解析一些JSON,这给了我一个NSDictionary,我使用这个dictionary在NSObject类型的valueEntity上填充属性

[myObject setValuesForKeysWithDictionary:JSONDict];
(myObject的属性名和类型与JSON解析器中的字典相同)

有没有另一种方法,我有一个NSDictionary,我想用我的NSObject子类中的属性及其值“填充”它。 正如我在标题中所建议的,大致如下:

单程

反过来

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

有了字典,我可以:

[myManagedObject setValuesForKeysWithDictionary:dict];
一旦我完成了上述操作,我就无法恢复字典表示法?

是的,方法是:

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys
传入一个表示感兴趣的对象属性的键数组,然后返回一个包含属性值的字典

NSKeyValueCoding
协议定义了许多功能强大且非常有用的方法;这是一件很容易熟悉的事情

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


您真的要获取所有属性吗?通常,将对象的所有属性作为字典来获取是没有意义的。例如,如果一个
NSManagedObject
包含一个关系,是否也要在字典中找到它?如果是,您希望如何表示它

正如jlehr所说,最好使用
字典和valuesforkeys:
显式地提供一组键

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

顺便说一下,使用
setValuesForKeysWithDictionary:
将从Internet返回的
JSON
对象分配给
NSManagedObject
是非常危险的。因为,如果
JSON
对象碰巧包含一个您不期望的额外密钥,那么您的代码可能会突然崩溃。所以,不要这样做

另一条评论:你的伪代码

NSObject *myObject = [[NSObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];
没有多大意义:是的,您可以对
NSObject
调用
setValuesForKeysWithDictionary:
,但它会失败,因为您无法
setValue:forKey:
JSONDict
中的任何条目调用普通
NSObject
。我想你知道这一点,但我想明确地说这一点,这样一来,看到这个页面的新手就不会被愚弄。

使用了一些运行时魔法来获取对象上声明的所有属性,并在不手动提供属性名称的情况下获取字典


我还发现了一个,它们的手法差不多一样,但包装很好。他们还可以从对象创建json或plist。

你好,谢谢:)我发现它不像[obj setValuesforKeysWithDictionary:dict]那样自动,但正如Yuji所指出的,这使得拾取和选择属性以及避免关系等成为可能。这非常好,因为我现在可以维护跨对象共享的单个属性名称数组,这是一个更灵活的解决方案。再次感谢你,我马上就上指南。谢谢你的回答。。我在找同样的…:)你好,Yuji,也谢谢你。我现在还不应该走运行时路线:)我只想让NSObject示例变得更合理,我真的很高兴你们都明白了我试图实现的目标,尽管我缺乏准确描述它的词汇。实际上,在JSON值“进入”对象之前,我会对其进行解析、细化和验证,但再次感谢您,我从您的回答中得到了一些很好的提示。对我来说真的很有用,正是我想要的:)
[myManagedObject setValuesForKeysWithDictionary:dict];
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys
NSObject *myObject = [[NSObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];