Статьи

Objective-C литералы

Этот урок научит вас, как программировать более эффективно, используя объектные литералы!


В программировании литерал — это просто фиксированное значение, которое программист вводит в файл исходного кода. Вот несколько примеров из 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 теперь могут быть представлены литералами объекта.

Следующий фрагмент кода иллюстрирует традиционный стиль:

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. Новый компилятор LLVM позволяет создавать литералы коллекций как для массивов, так и для словарей, но не для наборов.

Старый синтаксис для создания 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 . Ура!