Программирование под iPhone, iPad Objective-C уроки на русском статьи новости

2013-06-20 10:02


Литералы - это языковые дополнения упрощения общих Objective-C моделей программирования. Они делают программу более краткой, а также упрощают работу с памятью. В моих первых урока часто встречаются записи типа:

 

NSArray *a3 = [NSArray arrayWithObject:@"An object"];

 

или вот так:

 

NSArray *girls = [NSArray arrayWithObjects:@"Amanda", @"Ira", @"Natali", nil];
NSArray *boys = [NSArray arrayWithObjects:@"Sergei", @"Vova", @"Ivan", nil];
NSDictionary *children = [NSDictionary dictionaryWithObjectsAndKeys:girls, @"girls", boys, @"boys", nil];

 

А позже, в уроке Раскрывающаяся таблица Вы могли увидеть следующую запись:

 

self.students = @[girlsSection, boysSection];

 

Подробнее об этой и подобных записях пойдет речь в этом уроке. Давайте посмотрим как будут выглядеть записи с первых уроков примени мы к ним литералы:

 

//До
NSArray *a3 = [NSArray arrayWithObject:@"An object"];
//После
NSArray *a3 = @[@"An object"];

//До
NSArray *girls = [NSArray arrayWithObjects:@"Amanda", @"Ira", @"Natali", nil];
NSArray *boys = [NSArray arrayWithObjects:@"Sergei", @"Vova", @"Ivan", nil];
NSDictionary *children = [NSDictionary dictionaryWithObjectsAndKeys:girls, @"girls", boys, @"boys", nil];
//После
NSDictionary *children = @{@"girls": @[@"Amanda", @"Ira", @"Natali"], @"boys": @[@"Sergei", @"Vova", @"Ivan"]};

 

Литералы просто скрвают за собой длинные названия методов. Компактность видна невооруженным взглядом. Но на инициализации массивов и словарей возможности литералов не ограничиваются. Рассмотрим несколько примеров с классмо NSNumber.

 

NSNumber *letterNumber = @'W';          // аналогично [NSNumber numberWithChar:'W']
NSNumber *intNumber = @82;              // аналогично [NSNumber numberWithInt:82]
NSNumber *floatNumber = @3.141592654F;  // аналогично [NSNumber numberWithFloat:3.141592654F]
NSNumber *doubleNumber = @3.1415926535; // аналогично [NSNumber numberWithDouble:3.1415926535]
NSNumber *yesNumber = @YES;             // аналогично [NSNumber numberWithBool:YES]
NSNumber *noNumber = @NO;               // аналогично NSNumber numberWithBool:NO]

 

До этого с помощью литералов мы лишь инициализировали массивы и словари, а как на счет установки/получения значений в них?

 

NSMutableArray *items = [NSMutableArray array];
items[0] = @"Item1";            //строка записана
NSLog(@"str is %@", items[0]);  //строка прочитана
items[1] = @"Item2";            //строка записана
items[10] = @"Item10";          //ошибка записи (индекс за пределами диапазона массива)
items[1] = nil;                 //ошибка (нельзя записывать в массив пустые значения)

 

Похожая ситуация со словарями, разница лишь в том, что нет необходимости контролировать диапазон индексов:

 

NSMutableDictionary *items = [NSMutableDictionary dictionary];
items[@"key1"] = @"Item1";              //строка записана
NSLog(@"str is %@", items[@"key1"]);    //строка прочитана
items[@"key2"] = @"Item2";              //строка записана
items[@"key3"] = nil;                   //ошибка (нельзя записывать в словарь пустые значения)

 

Это далеко не все возможности литералов. Пусть данный пример станет для вас трамплином в мир оптимизации и упрощения кода.