我刚开始学习这个,并且教程开始时使用@符号在所有数字文字和字符串文字之前,我想“好吧,Objective-C在文字之前使用@符号”,但接下来的事情你知道他们使用了一些数字没有 @符号,我完全失去了。
(我说的是'数字',因为我害怕说int,因为Objective-C / C有这么多类型的数字。)
有什么区别?
答案 0 :(得分:4)
Objective C是C的扩展,因此它在C使用文字的地方使用常规文字 - 即提供基本类型int
,long
等的值。
此外,Objective C支持Cocoa框架的NSNumber
类。此类的对象用于换行原始值,以用于需要对象的用途 - 例如,放入集合中。 Cocoa集合不接受基本类型的值,因此在将数值放入集合之前需要提供对象包装器。
目标C不支持创建类型为NSNumber
的文字,因此您需要手动包装文字,如下所示:
[NSNumber numberWithInt:4]
键入的内容太多,尤其是当您需要定义多个此类值以放入集合时。这就是为什么Objective C为创建NSNumber
s添加了另一种语法 - 具有@
符号的语法。因此,当您编写@4
时,这与编写[NSNumber numberWithInt:4]
相同,但输入的次数要少得多。例如,在旧语法中看起来像这样的初始化
NSArray *oneTwoThree = [NSArray arrayWithObjects: [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], nil];
现在看起来像
NSArray *oneTwoThree = @[@1, @2, @3];
更具可读性。
注意:第二个代码段也使用新语法进行数组初始化。
答案 1 :(得分:2)
int
类型和NSNumber
对象之间存在差异。 int是用于存储整数的数据类型。您可以像这样创建一个int:int i = 4;
NSNumber是一个Objective-C对象,可以存储任何类型的数字,以及int,double,float,short,long等。这个创建类似于NSNumber *num = @4;
,实际上变为NSNumber *num = [NSNumber numberWithInt: 4];
使用@4
而不是4
的主要原因是NSArrays和NSDictionary。您只能在这些对象中存储对象,而不是int或float等类型。因此,如果您想要一组数字,则必须像[NSArray arrayWithObjects: @1, @2, @3, @4, nil];
@已经实现了其他用途。就像数字如何通过向其添加@而成为对象一样,C-String "Hello World"
成为具有@"Hello World"
的Objective-C对象(NSString)。 C-Array [1,2,3,4]
成为带@[@1,@2,@3,@4]
的Obj-C对象(NSArray)。与词典相同:@{key,value}
答案 2 :(得分:0)
一个是数字(一个int,一个标量)。另一个是NSNumber(一个Objective-C对象;在这个表示法上,见http://clang.llvm.org/docs/ObjectiveCLiterals.html)。