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

How to iterate concisely through @properties on an NSObject subclass to set properties from a plist?

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

NSString *name;
NSNumber *num;

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

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

具有两个 BSObject 的示例 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的key是一样的!有什么办法可以利用这个事实吗? 我相信过程语言,我会使用类似 "exec()" 的东西从 属性 名称中获取值,假设我可以以某种方式获取对象的属性数组? 恐怕我不太确定我在寻找什么,因此我的 Google 搜索结果是空的。

你的代码示例很乱,但你想要的是这样的:

[new setValuesForKeysWithDictionary:dict];