2015-02-13 1 views
1

Скажем, у меня есть подкласс NSObject (давайте назовем его «BSObject») со следующими свойствами:Как выполнить сжатие с помощью @properties в подклассе NSObject для установки свойств из plist?

NSString *name; 
NSNumber *num; 

У меня есть NSMutableArray из BSObjects (давайте называть это один «BSCollection»).

Для хранения на диске у меня есть список свойств, который представляет собой набор словарей. BSCollection представлен корневым объектом (массивом), и каждый элемент массива представляет собой словарь, представляющий объект BSObject. Ключ словаря - это имя свойства, а значение - значение объекта BSObject.

Пример PLIST с двумя BSObjects:

<?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 в BSCollection из BSObjects как можно короче. Я знаю, что я мог бы сделать что-то вроде этого для каждой пары ключ/значение:

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()», чтобы получить значение из имени свойства, предполагая, что можно каким-то образом получить массив свойств объекта? Боюсь, я не совсем уверен, что я ищу, поэтому мои поисковые запросы Google оказались пустыми.

+0

'[новый objectForKey: @ "новый"];' Вы имеете в виду '[объект objectForKey: @ "новый"]; ' –

+0

@LeoNatan: На самом деле,' @ "name" ', а не' @ "new" '. Множество ошибок в примере кода. –

+0

@Ken Right haha ​​ –

ответ

0

Ваш пример кода перепутались, но то, что вы хотите что-то вроде:

[new setValuesForKeysWithDictionary:dict]; 
+0

Где «dict» в вашем примере - «объект» в моем, я думаю. Благодаря! – user4034838