Objective c 是否有一个相反的说法;设置RKEYSWITHDIctionary“的值”makeDictionaryWithObjectProperties?
我从一个web服务解析一些JSON,这给了我一个NSDictionary,我使用这个dictionary在NSObject类型的valueEntity上填充属性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子类中的属性及其值“填充”它。 正如我在标题中所建议的,大致如下: 单程 反过来 这样做的
[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];