为什么我不能创建整数的 NSMutableArray?
Why can't I create an NSMutableArray of integers?
Objective C 中不允许使用这种格式吗?
NSMutableArray arrayA=[0,1,2,3,4,5];
是一次加一个整数的唯一方法吗?
你不能这样做,因为整数是原语,NSArray
和 NSMutableArray
不能存储原语。您可以使用创建 NSNumber
s:
的文字语法来实现
NSMutableArray *arrayA=[@[@0,@1,@2,@3,@4,@5] mutableCopy];
由于数组中的值是 NSNumber
s,如果您想通过调用 intValue
来获取整数,则需要将它们解包。
这个问题分为两部分:
整数是值类型,NSMutableArray 只能包含对象类型。
正如另一条评论所说,有一个神奇的语法:
@1
也就是说 "I know this is a primitive, but please oh mighty compiler auto-magically make it an object for me."
同样,有这样的语法:
@[ ... ]
将 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 } ;
这通常称为 "boxing",因为您将一个基本体装箱到一个对象中。
请注意,数字的内部部分不一定是文字:
int i = 5 ;
NSNumber * ii = @(i) ;
char const* str = "abc" ;
NSString * string = @(str) ;
有关详细信息,请参阅此内容:http://clang.llvm.org/docs/ObjectiveCLiterals.html
Objective C 中不允许使用这种格式吗?
NSMutableArray arrayA=[0,1,2,3,4,5];
是一次加一个整数的唯一方法吗?
你不能这样做,因为整数是原语,NSArray
和 NSMutableArray
不能存储原语。您可以使用创建 NSNumber
s:
NSMutableArray *arrayA=[@[@0,@1,@2,@3,@4,@5] mutableCopy];
由于数组中的值是 NSNumber
s,如果您想通过调用 intValue
来获取整数,则需要将它们解包。
这个问题分为两部分:
整数是值类型,NSMutableArray 只能包含对象类型。
正如另一条评论所说,有一个神奇的语法:
@1
也就是说 "I know this is a primitive, but please oh mighty compiler auto-magically make it an object for me."
同样,有这样的语法:
@[ ... ]
将 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 } ;
这通常称为 "boxing",因为您将一个基本体装箱到一个对象中。
请注意,数字的内部部分不一定是文字:
int i = 5 ;
NSNumber * ii = @(i) ;
char const* str = "abc" ;
NSString * string = @(str) ;
有关详细信息,请参阅此内容:http://clang.llvm.org/docs/ObjectiveCLiterals.html