2015-06-13 1 views

ответ

1

Есть две части к этому вопросу:

Целых являются оценочными типами и NSMutableArray может иметь только объектные тип в нем.

Как еще один комментарий сказал, есть волшебный синтаксис:

@1 

Который говорит: «Я знаю, что это примитивно, но, пожалуйста, о могучий компилятор автоматически волшебно сделать это объект для меня.»

Аналогично, есть этот синтаксис:

@[ ... ] 

, который преобразует C-массив с Objective-C NSArray [подкласса].

Таким образом, вы можете сделать это:

NSArray * array = @[ @1 , @2 , @3 , ... ] ; 

который даст вам массив чисел. Вы должны были бы сделать это, чтобы использовать их, хотя:

for (NSNumber * number in array) 
{ 
    NSLog (@"This value is %i" , (int)number.intValue) ; 
    // Alternatively, which does the exact same thing: 
    NSLog (@"This value is %i" , (int)[number intValue]) ; 
} 

Если вы хотите, чтобы сделать его изменяемым:

NSMutableArray * array = [ @[@1,@2,@3] mutableCopy ] ; 

Другие языки (например, Python) имеют синтаксис, который вы хотите встроенный, потому что они являются их собственным языком и могут внутренне представлять что-либо как тип объекта или тип значения. Им не нужно различать их, и они оплачивают стоимость с точки зрения оптимизации.

Объектив-C основан на C и должен соответствовать C. Кроме того, синтаксис должен соответствовать C, а число и [] токены имеют определенные значения в C и C++, поэтому они не могут просто переопределить их. Поэтому они использовали свой любимый синтаксис: знак «@», рисуя его после строк.

char const * str = "abc" ; 
NSString * str = @"abc" ; 

int i = 1 ; 
NSNumber * i = @1 ; 

int arr[] = { 1 , 2 , 3 } ; 
NSArray * arr = @[ @1 , @2 , @3 ] ; 

// note: there's no concept of a dictionary in C 
NSDictionary * dict = @{ @"a":@1 , @"b":@2 } ; 

Это часто называют «бокс», потому что вы боксируете примитив в объект.

Обратите внимание, что внутренняя часть для ряда не обязательно должен быть буквальным:

int i = 5 ; 
NSNumber * ii = @(i) ; 

char const* str = "abc" ; 
NSString * string = @(str) ; 

Смотреть это для получения дополнительной информации: http://clang.llvm.org/docs/ObjectiveCLiterals.html

1

Вы не можете сделать это, потому что целые числа являются примитивами, а NSArray и NSMutableArray не могут хранить примитивы. Вы можете сделать это, используя синтаксис литерала, который создает NSNumber S:

NSMutableArray *arrayA=[@[@0,@1,@2,@3,@4,@5] mutableCopy]; 

Поскольку значения внутри массива NSNumber s, вам нужно будет разворачивать их, если вы хотите, чтобы получить целые числа, вызвав intValue на них.

Смежные вопросы