Литералы для NSNumber, NSArray, NSDictionary в Objective-C

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"];

Добавить комментарий


+ один = семь

Ваш e-mail не будет доступен другим пользователям. Все поля обязательны для заполнения.