Поддержка литералов в Objective-C для NSNumber
, NSArray
, NSDictionary
появилась в Xcode c версии 4.4 (LLVM 4.0).
Используя новый синтаксис нет возможности создавать изменяемые экземпляры
NSNumber
/* Допустимо использование суффиксов: u - unsigned, f - float, l - long, ll - long long */
NSNumber *myNumber = @10u;
/* Эквивалентно */
NSNumber *myNumber= [NSNumber numberWithInt:10];
NSNumber *yesNumber = @YES;
/* Эквивалентно */
[NSNumber numberWithBool:YES]
NSArray
Инициализация
NSArray *array = @[@"Hello", @"There", @"How Are You", @42];
/* Эквивалентно */
NSArray *array = [NSArray arrayWithObjects:@"Hello", @"There", @"How Are You", [NSNumber numberWithInt:42], nil];
При использовании синтаксиса литералов, нет необходимости добавлять 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 arrayAtObject:1]);
Если указать не существующий индекс, то будет выброшено исключение NSRangeException:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '***
-[__NSArrayI objectAtIndex:]: index 4 beyond bounds [0 .. 3]
Также можно использовать отрицательные индексы:
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 arrayAtObject:([array count] - 1)]);
Изменение существующего элемента:
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"]);
Если указать не существующий индекс, то будет возвращено значение nil
Изменение существующего элемента:
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 element" forKey:@"New value"];