Создание списков свойств программно
Можно создать график объектов списка свойств вложенными объектами списка свойств различных типов в массивах и словарях. Следующие разделы сообщают подробности относительно выполнения этого программно.
Создание списка свойств в 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; |
} |