antonio's blog

antonio's blog


Блог о всяком разном, связанном с разработкой ПО. Пишу редко, когда есть время и желание.

Anton Dobkin
Author

Share


Tags


Литералы NSNumber, NSArray, NSDictionary в LLVM 4.0

Anton DobkinAnton Dobkin

Поддержка литералов в 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"];
Anton Dobkin
Author

Anton Dobkin

Comments