始终可以使用vararg方法调用创建NSArrays(和NSDictionaries / NSNumber),例如:
[NSArray arrayWithObjects: @"a", @"b", @"c", nil];
在LLVM和Clang的新改进中,可以使用内联文字创建这些吗?
答案 0 :(得分:95)
使用this change到LLVM代码库,Apple在即将推出的Clang编译器版本中为文字添加了一种新语法。
之前,使用基于C的数组创建数组,并将其动态转换为Objective-C对象,例如:
NSArray* array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
请注意,因为这是一个varargs元素,所以你必须提供一个结尾' nil'在列表的末尾。但是,现在有一种更简单的方法:
NSArray* array = @[ @"One", @"Two", @"Three" ];
注意,需要在[]之前的前导@来区分它和普通的C数组(或消息发送)。另请注意,尾随 ' nil'不再需要。
对于内联字典文字进行了类似的更改,类似于JSON结构:
NSDictionary* dict = @{
@"Key1": @"Value1",
@"Key2": @"Value2",
};
最后,添加了NSInteger(等)的新文字:
NSNumber* value = @3.141;
请注意,虽然这适用于浮点(@3.141F
)和双精度(@3.141
),但它不适用于long double
,因为编译器不支持这些。因此,@3.141D
将是编译时错误。
由于定义了常量,@INT_MAX
是一个有效的有效值,但@INT_MIN
不是,因为后者是通过编译时表达式定义的,而不是文字本身。
还有布尔类型的扩展:
NSNumber* yes = @YES; // [NSNumber numberWithBool:YES]
NSNumber* no = @NO; // [NSNumber numberWithBool:NO]
NSNumber* trueBool = @true; // [NSNumber numberWithBool:(BOOL)true]
NSNumber* falseBool = @false; // [NSNumber numberWithBool:(BOOL)false]
此更改还引入了__objc_yes
和__objc_no
文字,以支持仅通过文字值解析类型。它们的使用在预处理器中被#if __has_feature(objc_bool)
保护,但开发人员应继续在代码中使用YES
和NO
。
最后,现在可以使用数组括号来下载数组和字典,使用lvalue
和rvalue
表达式:
NSMutableArray* stuff = ...
id first = stuff[0];
stuff[0] = anotherObject;
NSMutableDictionary* moreStuff = ...
id conference = moreStuff[@"NSConf"]
moreStuff[@"SponsoredBy"] = @"NSConfDuck"
数组样式下标(使用NSUInteger
)映射到objectAtIndexedSubscript:
和相应的setObject:atIndexedSubscript:
,同时使用objectForKeyedSubscript:
和{{1}访问字典访问权限}
请注意,由于这个答案最初编写,因此Clang增加了对非文字Objective-C表达式的支持,称为“盒装表达式”
这意味着可以使用setObject:forKeyedSubscript:
作为@(3+4)
的等效内容,@7
作为@("Hello World")
。请注意,计算结果为@"Hello World"
的C表达式将导致异常,而null
之类的参数将被视为编译时错误。
也可以使用'盒装枚举'对于具有已知类型的类型,所以
enum { 北, 南, 东, 西方, };
可以放入带有@(null)
的盒装枚举类型,其值为@(North)
。
盒装表达将在铿锵3.2开始提供。可以使用0
预处理器测试来测试它。
答案 1 :(得分:5)
NSNumber *intNumber1 = @42;
NSArray *array1 = @[@"foo", @42, @"bar", @3.14];
NSDictionary *dictionary1 = @{ @1: @"red", @2: @"green", @3: @"blue" };
来源:http://blog.ablepear.com/2012/02/something-wonderful-new-objective-c.html