为什么我不能创建一个整数的NSMutableArray?

时间:2015-06-13 02:52:59

标签: objective-c arrays integer nsmutablearray

目标C中不允许使用这种格式吗?

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

是通过一次添加一个整数来实现此目的的唯一方法吗?

2 个答案:

答案 0 :(得分:1)

您不能这样做,因为整数是基元,而NSArrayNSMutableArray无法存储基元。您可以使用创建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