Скажем, у меня есть подкласс 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 оказались пустыми.
'[новый objectForKey: @ "новый"];' Вы имеете в виду '[объект objectForKey: @ "новый"]; ' –
@LeoNatan: На самом деле,' @ "name" ', а не' @ "new" '. Множество ошибок в примере кода. –
@Ken Right haha –