目标C中不允许使用这种格式吗?
NSMutableArray arrayA=[0,1,2,3,4,5];
是通过一次添加一个整数来实现此目的的唯一方法吗?
答案 0 :(得分:1)
您不能这样做,因为整数是基元,而NSArray
和NSMutableArray
无法存储基元。您可以使用创建NSNumber
s:
NSMutableArray *arrayA=[@[@0,@1,@2,@3,@4,@5] mutableCopy];
由于数组中的值是NSNumber
s,如果要通过调用intValue
来获取整数,则需要解包它们。
答案 1 :(得分: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)具有您想要内置的语法,因为它们是他们自己的语言,并且可以在内部将任何内容表示为对象类型或值类型。他们不必区分它们,并且它们在可优化性方面付出了代价。
Objective-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