Этот формат не разрешен в Objective C?Почему я не могу создать NSMutableArray целых чисел?
NSMutableArray arrayA=[0,1,2,3,4,5];
это единственный способ сделать это, добавив одно целое за раз?
Этот формат не разрешен в Objective C?Почему я не могу создать NSMutableArray целых чисел?
NSMutableArray arrayA=[0,1,2,3,4,5];
это единственный способ сделать это, добавив одно целое за раз?
Есть две части к этому вопросу:
Целых являются оценочными типами и 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
Вы не можете сделать это, потому что целые числа являются примитивами, а NSArray
и NSMutableArray
не могут хранить примитивы. Вы можете сделать это, используя синтаксис литерала, который создает NSNumber
S:
NSMutableArray *arrayA=[@[@0,@1,@2,@3,@4,@5] mutableCopy];
Поскольку значения внутри массива NSNumber
s, вам нужно будет разворачивать их, если вы хотите, чтобы получить целые числа, вызвав intValue
на них.
относятся к этому: http://stackoverflow.com/а/18600713/4298881 – Surely