Создание списков свойств программно

Можно создать график объектов списка свойств вложенными объектами списка свойств различных типов в массивах и словарях. Следующие разделы сообщают подробности относительно выполнения этого программно.

Создание списка свойств в Objective C

Если все объекты в агрегате происходят из, можно создать список свойств в Objective C NSDictionary, NSArray, NSString, NSDate, NSData, или NSNumber класс. Код в Перечислении 3-1 создает список свойств, состоящий из NSDictionary объект (корневой объект), который содержит два словаря, каждый содержащий строку, дату и массив чисел.

Перечисление 3-1  , Создающее список свойств программно (Objective C)

        NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:2];
        NSDictionary *innerDict;
        NSString *name;
        NSDate *dob;
        NSArray *scores;
 
        scores = [NSArray arrayWithObjects:[NSNumber numberWithInt:6],
            [NSNumber numberWithFloat:4.6], [NSNumber numberWithLong:6.0000034], nil];
        name = @"George Washington";
        dob = [NSDate dateWithString:@"1732-02-17 04:32:00 +0300"];
        innerDict = [NSDictionary dictionaryWithObjects:
            [NSArray arrayWithObjects: name, dob, scores, nil]
            forKeys:[NSArray arrayWithObjects:@"Name", @"DOB", @"Scores"]];
        [rootObj setObject:innerDict forKey:@"Washington"];
 
        scores = [NSArray arrayWithObjects:[NSNumber numberWithInt:8],
            [NSNumber numberWithFloat:4.9],
            [NSNumber numberWithLong:9.003433], nil];
        name = @"Abraham Lincoln";
        dob = [NSDate dateWithString:@"1809-02-12 13:18:00 +0400"];
        innerDict = [NSDictionary dictionaryWithObjects:
            [NSArray arrayWithObjects: name, dob, scores, nil]
            forKeys:[NSArray arrayWithObjects:@"Name", @"DOB", @"Scores"]];
        [rootObj setObject:innerDict forKey:@"Lincoln"];
 
        id plist = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj
            format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

Вывод XML кода в Перечислении 3-1 показан в Перечислении 3-2.

Перечисление 3-2  список свойств XML, произведенный, как выведено

<?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">
<dict>
    <key>Lincoln</key>
    <dict>
        <key>DOB</key>
        <date>1809-02-12T09:18:00Z</date>
        <key>Name</key>
        <string>Abraham Lincoln</string>
        <key>Scores</key>
        <array>
            <integer>8</integer>
            <real>4.9000000953674316</real>
            <integer>9</integer>
        </array>
    </dict>
    <key>Washington</key>
    <dict>
        <key>DOB</key>
        <date>1732-02-17T01:32:00Z</date>
        <key>Name</key>
        <string>George Washington</string>
        <key>Scores</key>
        <array>
            <integer>6</integer>
            <real>4.5999999046325684</real>
            <integer>6</integer>
        </array>
    </dict>
</dict>
</plist>

Создание списка свойств в базовой основе

Примеры в этом разделе демонстрируют, как создать и работать со списками свойств с помощью Базовых функций Основы. Код проверки ошибок был удален для ясности. На практике жизненно важно, чтобы Вы проверили на ошибки, потому что передача плохих параметров в Базовые подпрограммы Основы может заставить Ваше приложение отказывать.

Перечисление 3-3 показывает Вам, как создать очень простой список свойств — массив объектов CFString.

Перечисление 3-3  , Создающее простой список свойств из массива

#include <CoreFoundation/CoreFoundation.h>
#define kNumFamilyMembers 5
 
void main () {
    CFStringRef names[kNumFamilyMembers];
    CFArrayRef  array;
    CFDataRef   xmlData;
 
    // Define the family members.
    names[0] = CFSTR("Marge");
    names[1] = CFSTR("Homer");
    names[2] = CFSTR("Bart");
    names[3] = CFSTR("Lisa");
    names[4] = CFSTR("Maggie");
 
    // Create a property list using the string array of names.
    array = CFArrayCreate( kCFAllocatorDefault,
                (const void **)names,
                kNumFamilyMembers,
                &kCFTypeArrayCallBacks );
 
    // Convert the plist into XML data.
    xmlData = CFPropertyListCreateXMLData( kCFAllocatorDefault, array );
 
    // Clean up CF types.
    CFRelease( array );
    CFRelease( xmlData );
}

Перечисление 3-4 показывает как содержание xmlData, создаваемый в Перечислении 3-3, посмотрел бы, если распечатано на экран.

Перечисление 3-4  XML создается примером программы

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Marge</string>
    <string>Homer</string>
    <string>Bart</string>
    <string>Lisa</string>
    <string>Maggie</string>
</array>
</plist>
 

О числах и списках свойств в базовой основе

Вы не можете использовать значения числовых данных C непосредственно в Базовых списках свойств Основы. Базовая Основа обеспечивает функцию CFNumberCreate преобразовать численные значения C в объекты CFNumber, форма, требующаяся, чтобы использовать числа в списках свойств.

CFNumber возражает подачам просто как обертке для числовых значений C. Базовая Основа включает функции, чтобы создать CFNumber, получить его значение и сравнить два объекта CFNumber. Обратите внимание на то, что объекты CFNumber являются неизменными относительно значения, но вводят информацию, может не сохраняться. Можно получить информацию о типе объекта CFNumber, но это - тип объект CFNumber, используемый для хранения значения, и может не быть тем же типом как исходные C данные.

При сравнении объектов CFNumber преобразование и сравнение следуют за человеческими ожиданиями и не C продвижение и правила сравнения. Отрицательный нуль сравнивает меньше, чем положительный нуль. Положительная бесконечность выдерживает сравнение больше, чем все кроме себя, с которым она выдерживает сравнение равный. Отрицательная бесконечность сравнивает меньше, чем все кроме себя, с которым она выдерживает сравнение равный. В отличие от общепринятой практики, если обоими числами является NaNs, то они выдерживают сравнение равный; если только одним из чисел является NaN, то NaN выдерживает сравнение больше, чем другое число, если это отрицательно, и меньше, чем другое число, если это положительно.

Перечисление 3-5 показывает, как создать объект CFNumber из 16-разрядного целого числа и затем получить информацию об объекте CFNumber.

Перечисление 3-5  , Создающее CFNumber, возражает от целого числа

Int16               sint16val = 276;
CFNumberRef         aCFNumber;
CFNumberType        type;
Int32               size;
Boolean             status;
 
// Make a CFNumber from a 16-bit integer.
aCFNumber = CFNumberCreate(kCFAllocatorDefault,
                           kCFNumberSInt16Type,
                           &sint16val);
 
// Find out what type is being used by this CFNumber.
type = CFNumberGetType(aCFNumber);
 
// Now find out the size in bytes.
size = CFNumberGetByteSize(aCFNumber);
 
// Get the value back from the CFNumber.
status = CFNumberGetValue(aCFNumber,
                          kCFNumberSInt16Type,
                          &sint16val);

Перечисление 3-6 создает другой объект CFNumber и сравнивает его с тем, создаваемым в Перечислении 3-5.

Перечисление 3-6  , Сравнивающее два объекта CFNumber

CFNumberRef         anotherCFNumber;
CFComparisonResult  result;
 
// Make a new CFNumber.
sint16val = 382;
anotherCFNumber = CFNumberCreate(kCFAllocatorDefault,
                        kCFNumberSInt16Type,
                        &sint16val);
 
// Compare two CFNumber objects.
result = CFNumberCompare(aCFNumber, anotherCFNumber, NULL);
 
switch (result) {
    case kCFCompareLessThan:
        printf("aCFNumber is less than anotherCFNumber.\n");
        break;
    case kCFCompareEqualTo:
        printf("aCFNumber is equal to anotherCFNumber.\n");
        break;
    case kCFCompareGreaterThan:
        printf("aCFNumber is greater than anotherCFNumber.\n");
        break;
}