在Objective-C中是否有一些文字字典或数组语法?

用可变参数方法调用创buildNSArrays(和NSDictionaries / NSNumber)总是可以的,例如:

[NSArray arrayWithObjects: @"a", @"b", @"c", nil]; 

可以通过对LLVM和Clang的新改进,使用在线文字创build这些文件吗?

随着对LLVM代码库的这种改变 ,苹果公司在即将到来的Clang编译器版本中增加了一个新的文字语法。

在此之前,数组是使用基于C的数组创build的,并被即时转换为Objective-C对象,如:

 NSArray* array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil]; 

请注意,由于这是一个可变参数元素,因此您必须在列表末尾提供结尾“nil”。 但是,现在有一个更简单的方法:

 NSArray* array = @[ @"One", @"Two", @"Three" ]; 

请注意,在[]之前的前导@是必需的,以区分它和一个普通的C数组(或一个消息发送)。 还要注意,尾随'nil'不再需要。

对于内联字典文字已经做了类似的改变,类似于JSON结构:

 NSDictionary* dict = @{ @"Key1": @"Value1", @"Key2": @"Value2", }; 

最后,添加了NSInteger(等)的新文字:

 NSNumber* value = @3.141; 

请注意,尽pipe这适用于浮点( @3.141F )和双精度( @3.141F ),但对于long double @3.141F s不起作用,因为编译器不支持这些操作。 因此, @3.141D将是一个编译时错误。

由于定义了常量, @INT_MAX是一个有效的有效值,但@INT_MIN不是,因为后者是通过编译时expression式定义的,而不是本身的文字。

还有布尔types的扩展:

 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文字,以支持仅通过文字值parsingtypes。 它们的使用在预处理器中用#if __has_feature(objc_bool)来保护,但是开发者应该继续在代码中使用YESNO

最后,数组和字典现在都可以使用数组括号作为下标,既用作lvalue rvalueexpression式又用作rvalueexpression式:

 NSMutableArray* stuff = ... id first = stuff[0]; stuff[0] = anotherObject; NSMutableDictionary* moreStuff = ... id conference = moreStuff[@"NSConf"] moreStuff[@"SponsoredBy"] = @"NSConfDuck" 

数组样式下标(使用NSUInteger )被映射到objectAtIndexedSubscript:和相应的setObject:atIndexedSubscript:而字典访问使用objectForKeyedSubscript:setObject:forKeyedSubscript:

文字的完整语法可以在Clang / LLVM网站上看到

请注意,由于这个答案是最初编写的,Clang已经添加了对非文字Objective-Cexpression式的支持,称为“盒装expression式”

这意味着可以使用@(3+4)等同于@7 ,而@("Hello World")可以使用@"Hello World" 。 请注意,计算为null的Cexpression式将导致exception,像@(null)这样的参数将被视为编译时错误。

所以,对于已知types的types,也可以使用“Boxed枚举”

枚举{北,南,东,西,};

可以放置在带有@(North)的盒装枚举types中,其值为0

盒装expression式将在3.2以后的版本中提供。 可以使用__has_feature(objc_boxed_expressions)预处理器testing进行testing。

 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