目标 c - 为什么我不能创建整数的 NSMutableArray?



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

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)具有您想要内置的语法,因为它们是它们自己的语言,可以在内部将任何内容表示为对象类型或值类型。他们不必区分它们,并且根据可优化性付出代价。

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

你不能这样做,因为整数是基元,NSArrayNSMutableArray不能存储基元。您可以使用创建 NSNumber s 的文本语法来执行此操作:

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

由于数组中的值是 NSNumber s,因此如果您想通过调用整数来获取整数,则需要解开它们intValue

相关内容

  • 没有找到相关文章

最新更新