Этот урок научит вас, как программировать более эффективно, используя объектные литералы!
Литералы и буквальные выражения
В программировании литерал — это просто фиксированное значение, которое программист вводит в файл исходного кода. Вот несколько примеров из C:
1
2
|
int year = 2012;
char initial = ‘M’;
|
В вышеприведенном «2012» — это литерал int
а «M» — литерал.
Ученые-информатики также иногда ссылаются на буквальные выражения . Выражение — это просто группа значений и операторов, которые возвращают новое значение, например «2 * pi * r». Литеральное выражение — это выражение, которое содержит только литеральные значения, такие как «2 * 3,14 * 10».
Следующий фрагмент кода демонстрирует, как переменные могут быть созданы и назначены с помощью литеральных выражений в C:
1
2
|
int result = 15 / 5;
double = 5 / 2;
|
Поскольку Objective-C является надмножеством C, все строки кода, демонстрируемые в C, также являются допустимым синтаксисом Objective-C. Тем не менее, все продемонстрированные литералы были также для примитивных типов данных. Более интересное использование литералов — применять их к объектам.
Ниже приведен пример литерала объекта :
1
|
NSString *siteTitle = @»Mobiletuts+»;
|
В приведенной выше строке кода @"Mobiletuts+"
— это литерал объекта, который используется для представления строкового объекта. Без использования литерала объекта вышеприведенная строка кода должна была бы быть написана совсем по-другому, возможно, так:
1
|
NSString *siteTitle = [NSString stringWithUTF8String:»Mobiletuts»];
|
Как вы можете видеть, буквальный синтаксис объекта гораздо более краткий и читаемый.
С выпуском Apple LLVM Compiler 4.0 была добавлена дополнительная литеральная поддержка объектов для объектов NSNumber
объектов Array и Dictionary.
NSNumber Литералы
Объекты NSNumber
теперь могут быть представлены литералами объекта.
Следующий фрагмент кода иллюстрирует традиционный стиль:
01
02
03
04
05
06
07
08
09
10
11
|
NSNumber *boolYES = [NSNumber numberWithBool:YES];
NSNumber *boolNO = [NSNumber numberWithBool:NO];
NSNumber *charX = [NSNumber numberWithChar:’X’];
NSNumber *fortySevenInt = [NSNumber numberWithInt:47];
NSNumber *fortySevenUnsigned = [NSNumber numberWithUnsignedInt:47U];
NSNumber *fortySevenLong = [NSNumber numberWithLong:47L];
NSNumber *goldenRatioFloat = [NSNumber numberWithFloat:1.61803F];
NSNumber *goldenRatioDouble = [NSNumber numberWithDouble:1.61803];
|
Используя объектные литералы, вышеприведенное можно переписать так:
01
02
03
04
05
06
07
08
09
10
11
|
NSNumber *boolYES = @YES;
NSNumber *boolNO = @NO;
NSNumber *charX = @’X’;
NSNumber *fortySevenInt = @47;
NSNumber *fortySevenUnsigned = @47U;
NSNumber *fortySevenLong = @47L;
NSNumber *goldenRatioFloat = @1.61803F;
NSNumber *goldenRatioDouble = @1.61803;
|
Objective-C Коллекция Литералов
Коллекционные литералы являются невероятно полезным дополнением к Objective-C. Новый компилятор LLVM позволяет создавать литералы коллекций как для массивов, так и для словарей, но не для наборов.
NSArray Литералы
Старый синтаксис для создания NSArray
:
1
2
|
NSArray *instruments = [NSArray
arrayWithObjects: @»Ocarina», @»Flute», @»Harp», nil];
|
Новый объектный литеральный синтаксис для создания NSArray
:
1
|
NSArray *instruments = @[ @»Ocarina», @»Flute», @»Harp» ];
|
К сожалению, приведенный выше синтаксис не будет работать для объявления NSMutableArray
, но есть легкий NSMutableArray
. Просто mutableCopy
сообщение mutableCopy
вновь созданному объекту:
1
|
NSMutableArray *instrumentsMutable = [ @[ @»Ocarina», @»Flute», @»Harp» ] mutableCopy];
|
Словарь Литералы
Традиционный метод создания словаря с Objective-C выглядит примерно так:
1
2
3
|
NSArray *keys = [NSArray arrayWithObjects:@»Character», @»Weapon», @»Hitpoints», nil];
NSArray *objects = [NSArray arrayWithObjects:@»Zelda», @»Sword», [NSNumber numberWithInt:50], nil];
NSDictionary *stats = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
|
Или немного менее многословная альтернатива:
1
2
3
4
5
|
NSDictionary *stats = [NSDictionary dictionaryWithObjectsAndKeys:
@»Zelda», @»Character»,
@»Sword», @»Weapon»,
[NSNumber numberWithInt:50], @»Hitpoints»,
nil];
|
Оба вышеперечисленных являются яркими примерами того, почему в Objective-C сложилась плохая репутация чрезмерно многословного. Больше не надо! С помощью объектных литералов приведенный выше код можно переписать так:
1
2
3
|
NSDictionary *stats = @{ @»Character» : @»Zelda»,
@»Weapon» : @»Sword»,
@»Hitpoints» : @50 };
|
Это гораздо проще как понять, так и написать.
Подписка на коллекции
В дополнение к возможности создавать коллекции с объектными литералами, последний компилятор LLVM также представил поддержку доступа к значениям массива или словаря с помощью индексов.
Например, это традиционная форма, используемая для доступа к объекту из массива или словаря:
1
2
3
|
NSString *instrument = [instruments objectAtIndex:0];
NSString *name = [stats objectForKey:@»Character»];
|
С новой возможностью подписки вы можете просто сделать это:
1
2
3
|
NSString *instrument = instruments[0];
NSString *name = stats[@»Character»];
|
Более того, подписки на коллекции не ограничиваются только выбором объектов. Если коллекция изменчива, вы также можете переназначить значения:
1
2
3
|
instrumentsMutable[0] = @»Ocarina of Time»;
statsMutable[@»Weapon»] = @»Hammer»;
|
Это огромный шаг вперед для программистов на Objective-C, и я думаю, что он сделает язык более доступным для тех, кто переходит с других языков, таких как Java или C ++.
Выражения в штучной упаковке
Последней темой, которую стоит упомянуть в этом уроке, является понятие «штучные выражения». По сути, Objective-C теперь поддерживает преобразование результата выражения в стиле C в объект Objective-C. Основной синтаксис для этого выглядит так:
1
|
@( 2 * pi * r)
|
Результатом вышеупомянутого будет объект NSNumber
который содержит произведение, в 2 раза превышающее значение pi, умноженное на значение r. Конечно, мы могли бы сразу назначить этот продукт в переменную NSNumber:
1
|
NSNumber *diameter = @( 2 * pi * r );
|
Эта техника также будет работать с перечислениями и строками:
01
02
03
04
05
06
07
08
09
10
11
|
// Boxed Expressions with Enums
typedef enum { Sword, Hammer, Shield, Arrow } Weapons;
NSNumber *currentWeapon = @( Sword );
// Boxed Expressions with char *
NSString *login = @( getlogin() );
// Results
NSLog(@»Weapon: %@\nLogin: %@», currentWeapon, login);
|
Заворачивать
Это руководство предоставило вам краткий обзор литералов объектов, нового метода, представленного в Apple LLVM Compiler 4.0. Более подробное освещение этой темы см. В официальной документации LLVM .
Я надеюсь, вам понравилось читать этот урок. Не стесняйтесь оставлять любые ваши отзывы в комментариях ниже. Вы также можете связаться со мной в Twitter или Google Plus . Ура!