在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)
来保护,但是开发者应该继续在代码中使用YES
和NO
。
最后,数组和字典现在都可以使用数组括号作为下标,既用作lvalue
rvalue
expression式又用作rvalue
expression式:
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