Objective-C/Foundation Framework
В Objective-C добавлена поддержка синтаксиса литералов для NSNumber, NSArray, NSDictionary. Теперь можно создавать литералы для NSArray, NSDictionary и NSNumber, так же как строковые литералы NSString. Новый синтаксис поддерживается в XCode начиная с версии 4.4 DP1
Используя новый синтаксис нет возможности создавать изменяемые словари и массивы. Возможно это только временное ограничение.
NSNumber
/* Допустимо использование суффиксов: u - unsigned, f - float, l - long, ll - long long */
NSNumber *myNumber = @10u;
/* Эквивалентно */
NSNumber *myNumber= [NSNumber numberWithInt:10];
NSNumber *yesNumber = @YES;
/* Эквивалентно */
[NSNumber numberWithBool:YES];
Если указать не существующий индекс, то будет выброшено исключение NSRangeException.
При использовании синтаксиса литералов, нет необходимости добавлять nil элемент в конец массива.
Доступ к элементам массива
Теперь к элементам массива можно обратиться через индекс элемента заключенного в квадратные скобки:
NSArray *array = @[ @"Hello", @"There", @"How Are You", @42];
NSLog(@"array[1]: %@", array[1]);
/* Эквивалентно */
NSArray *array = [NSArray arrayWithObjects:@"Hello", @"There", @"How Are You",
[NSNumber numberWithInt:42], nil];
NSLog(@"array[1]: %@", [array objectAtIndex:1]);
Если указать не существующий индекс, то будет выброшено исключение NSRangeException:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '***
-[__NSArrayI objectAtIndex:]: index 4 beyond bounds [0 .. 3]
Также Вы не можете использовать отрицательные индексы.
Используя новый синтаксис также можно добавлять новые и/или изменять уже существующие элементы массивов
Изменение существующего элемента
NSMutableArray *array = [NSMutableArray arrayWithArray: @[@"Hello", @"There",
@"How Are You", @42]]];
array[1] = @"New value";
/* Эквивалентно */
NSMutableArray *array = [NSMutableArray arrayWithArray: @[@"Hello", @"There",
@"How Are You", @42]]];
[array replaceObjectAtIndex:1 withObject:@"New value"];
Добавление нового элемента
NSMutableArray *array = [NSMutableArray arrayWithArray: @[@"Hello", @"There",
@"How Are You", @42]]];
array[4] = @"New element";
/* Эквивалентно */
NSMutableArray *array = [NSMutableArray arrayWithArray: @[@"Hello", @"There",
@"How Are You", @42]]];
[array insertObject:@"New element" AtIndex:4];
NSDictionary
Инициализация
NSDictionary *dictionary = @{
@"string" : @"String",
@"date" : [NSDate date],
@"timestamp" : @1234567
};
/* Эквивалентно */
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"String", @"string",
[NSDate date], @"date",
[NSNumber numberWithInt:1234567], @"timestamp",
nil
];
Как и в случае с массивами, при использовании синтаксиса литералов, нет необходимости добавлять завершающий nil элемент.
Доступ к элементам словаря
К элементам словаря, также как и в случае с массивами, можно обратиться через индекс элемента заключенного в квадратные скобки:
NSDictionary *dictionary = @{
@"string" : @"String",
@"date" : [NSDate date],
@"timestamp" : @1234567,
@"nested": @{ @"A": @"stringA"}
};
NSLog(@"dictionary['string']: %@", dictionary[@"string"]);
NSLog(@"dictionary['string']: %@", dictionary[@"nested"][@"A"]);
NSLog(@"dictionary['string']: %@", dictionary[@"nested.A"]);
/* Эквивалентно */
NSDictionary *dictionary = @{
@"string" : @"String",
@"date" : [NSDate date],
@"timestamp" : @1234567
};
NSLog(@"dictionary['string']: %@", [dictionary objectForKey: @"string"]);
NSLog(@"dictionary['string']: %@", [[dictionary objectForKey: @"nested"]
valueForKey: @"A"]);
Если указать не существующий индекс, то будет возвращено значение null
Изменение существующего элемента
NSDictionary *dictionary = @{
@"string" : @"String",
@"date" : [NSDate date],
@"timestamp" : @1234567
};
NSMutableDictionary *mDictonary = [dictionary mutableCopy];
mDictonary[@"string"] = @"New string";
/* Эквивалентно */
NSDictionary *dictionary = @{
@"string" : @"String",
@"date" : [NSDate date],
@"timestamp" : @1234567
};
NSMutableDictionary *mDictonary = [dictionary mutableCopy];
[mDictonary setObject:@"New string" forKey:@"string"];
Добавление нового элемента
NSDictionary *dictionary = @{
@"string" : @"String",
@"date" : [NSDate date],
@"timestamp" : @1234567
};
NSMutableDictionary *mDictonary = [dictionary mutableCopy];
mDictonary[@"New element"] = @"New value";
/* Эквивалентно */
NSDictionary *dictionary = @{
@"string" : @"String",
@"date" : [NSDate date],
@"timestamp" : @1234567
};
NSMutableDictionary *mDictonary = [dictionary mutableCopy];
[mDictonary setObject:@"New value" forKey:@"New element"];