>NSString *const kFirstNameKey = @"firstName";

>NSString *const kLastNameKey = @"lastName";


>NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

>[dictionary setValue:@"Tim" forKey: kFirstNameKey];

>[dictionary setValue:@"Cook" forKey: kLastNameKey];


>__unused NSString *firstName = [dictionary valueForKey: kFirstNameKey];

>__unused NSString *lastName = [dictionary valueForKey: kLastNameKey];

>Но с развитием компилятора LLVM этот код можно сократить, придав ему следующий вид:

>NSString *const kFirstNameKey = @"firstName";

>NSString *const kLastNameKey = @"lastName";


>NSDictionary *dictionary = @{

>kFirstNameKey: @"Tim",

>kLastNameKey: @"Cook",

>};


>__unused NSString *firstName = dictionary[kFirstNameKey];

>__unused NSString *lastName = dictionary[kLastNameKey];

>Как видите, мы инициализируем словарь, давая ключи в фигурных скобках. Точно так же можно поступать и с массивами. Вот как мы обычно создаем и используем массивы:

>NSArray *array = [[NSArray alloc] initWithObjects:@"Tim", @"Cook", nil];

>__unused NSString *firstItem = [array objectAtIndex:0];

>__unused NSString *secondObject = [array objectAtIndex:1];

>А теперь, имея возможность подписывать объекты, мы можем сократить этот код следующим образом:

>NSArray *array = @[@"Tim", @"Cook"];

>__unused NSString *firstItem = array[0];

>__unused NSString *secondObject = array[0];


Компилятор LLVM не останавливается и на этом. Вы можете также добавлять подписывание и к собственным классам. Существует два типа подписывания:

подписывание по ключу – действуя таким образом, вы можете задавать внутри объекта значение для того или иного ключа точно так же, как вы делали бы это в словаре. Указывая ключ, вы также можете получать доступ к значениям внутри объекта и считывать их;

• подписывание по индексу – как и при работе с массивами, вы можете устанавливать/получать значения внутри объекта, предоставив для этого объекта индекс. Это целесообразно делать в массивоподобных классах, где элементы естественным образом располагаются в порядке, удобном для индексирования.

Сначала рассмотрим пример подписывания по ключу. Для этого создадим класс под названием Person, имеющий свойства firstName и lastName. Далее мы позволим программисту менять значения этих свойств (имя и фамилию), просто предоставив ключи для этих свойств.

Вам может понадобиться добавить к классу подобный механизм подписывания по ключу, например, по такой причине: имена ваших свойств могут изменяться и вы хотите предоставить программисту возможность устанавливать значения таких свойств, не учитывая, будут ли имена этих свойств впоследствии изменяться. В противном случае программисту лучше будет использовать свойства напрямую. Другая причина реализации подписывания по ключу – стремление скрыть точную реализацию/объявление ваших свойств от программиста и закрыть программисту прямой доступ к этим свойствам.

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


>#import 


>/* Мы будем использовать их как ключи для наших свойств firstName

>и lastName, так что если имена наших свойств firstName и lastName

>в будущем изменятся в реализации, нам не придется ничего переделывать

>и наш класс останется работоспособным, поскольку мы сможем просто

>изменить значения этих констант в нашем файле реализации */