如何通过 NSObject 子类上的 @properties 简洁地迭代以从 plist 设置属性?

Posted

技术标签:

【中文标题】如何通过 NSObject 子类上的 @properties 简洁地迭代以从 plist 设置属性?【英文标题】:How to iterate concisely through @properties on an NSObject subclass to set properties from a plist? 【发布时间】:2015-02-13 21:17:21 【问题描述】:

假设我有一个具有以下属性的 NSObject 子类(我们称之为“BSObject”):

NSString *name;
NSNumber *num;

我有一个 NSMutableArray 的 BSObjects(我们称它为“BSCollection”)。

对于磁盘上的存储,我有一个属性列表,它是一个字典数组。 BSCollection 由根对象(一个数组)表示,数组的每个元素都是一个字典,表示一个 BSObject。 字典的键是属性名,值是BSObject的值。

带有两个 BSObjects 的示例 plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>name</key>
        <string>this is a name</string>
        <key>num</key>
        <integer>34</integer>
    </dict>
    <dict>
        <key>name</key>
        <string>this is another name</string>
        <key>num</key>
        <integer>22222</integer>
    </dict>
</array>
</plist>

现在我想尽可能简洁地将 plist 加载到 BSObjects 的 BSCollection 中。我知道我可以为每个键/值对做这样的事情:

BSCollection = [BSCollection alloc] init];
if ([[NSFileManager defaultManager] fileExistsAtPath:URL]) 
  NSArray *rawXML = [[NSArray alloc] initWithContentsOfFile:URL];
  for (NSDictionary *object in rawXML) 
    BSObject *new = [[BSObject alloc] init];
    new.name = [new objectForKey:@"name"];
    new.num = [new objectForKey:@"num"];
    [BSCollection addObject:new];
  

但是:BSObject 的属性和 NSDictionary 的键是一样的!有没有办法可以利用这个事实? 我相信程序语言,我会使用“exec()”之类的东西从属性名称中获取值,假设我可以以某种方式获取对象的属性数组? 恐怕我不确定我在找什么,因此我的谷歌搜索结果是空的。

【问题讨论】:

[new objectForKey:@"new"]; 你的意思是[object objectForKey:@"new"]; @LeoNatan:实际上,@"name",而不是@"new"。示例代码中有很多错误。 @Ken 已修复.. 还有哪些错误? 您没有修复 Leo 指出的错误。您在BSObject 上调用-objectForKey:,而不是字典。此外,第一行缺少一个左括号。变量 rawXML 不是指原始 XML。 【参考方案1】:

你的代码示例搞砸了,但你想要的是这样的:

[new setValuesForKeysWithDictionary:dict];

【讨论】:

我认为你的例子中的“dict”是我的“object”。谢谢!

以上是关于如何通过 NSObject 子类上的 @properties 简洁地迭代以从 plist 设置属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NSObject 模型类转换为 NSManagedObject 的子类?

如何使用 NHibernate 联合子类映射抽象属性?

新的 NSManagedObject 子类与新的 NSObject 子类?

从 NSObject 的子类内部推送到 UIViewController

Objective-C基础笔记@property和@synthesize

CLLocationManager 始终为 null -Delegate 实现是单例类(NSObject 的子类而不是 UIViewController 的子类)