AlB*_*lue 39 objective-c llvm clang objective-c-literals
使用vararg方法调用始终可以创建NSArrays(和NSDictionaries/NSNumber),例如:
[NSArray arrayWithObjects: @"a", @"b", @"c", nil];
Run Code Online (Sandbox Code Playgroud)
在LLVM和Clang的新改进中,这些是否可以使用内联文字创建?
AlB*_*lue 95
通过对LLVM代码库的这一更改,Apple在即将推出的Clang编译器版本中为文字添加了一种新语法.
之前,使用基于C的数组创建数组,并将其动态转换为Objective-C对象,例如:
NSArray* array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];
Run Code Online (Sandbox Code Playgroud)
请注意,由于这是一个varargs元素,因此必须在列表末尾提供结尾"nil".但是,现在有一种更简单的方法:
NSArray* array = @[ @"One", @"Two", @"Three" ];
Run Code Online (Sandbox Code Playgroud)
注意,[]之前的前导@是必需的,以区分它和普通的C数组(或消息发送).另请注意,不再需要尾随'nil'.
对于内联字典文字也做了类似的更改,类似于JSON结构:
NSDictionary* dict = @{
@"Key1": @"Value1",
@"Key2": @"Value2",
};
Run Code Online (Sandbox Code Playgroud)
最后,添加了NSInteger(等)的新文字:
NSNumber* value = @3.141;
Run Code Online (Sandbox Code Playgroud)
请注意,虽然这适用于浮点(@3.141F)和双精度(@3.141),但它不适用于long doubles,因为编译器不支持这些包装.因此,@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]
Run Code Online (Sandbox Code Playgroud)
此更改还引入了__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"
Run Code Online (Sandbox Code Playgroud)
数组样式下标(使用NSUInteger)映射到objectAtIndexedSubscript:和相应的setObject:atIndexedSubscript:,而字典访问使用objectForKeyedSubscript:和访问setObject:forKeyedSubscript:
可以在Clang/LLVM网站上看到文字的完整语法
请注意,由于此答案最初编写,因此Clang添加了对非文字Objective-C表达式的支持,称为"盒装表达式"
这意味着,可以使用@(3+4)作为等同于@7,并@("Hello World")作为@"Hello World".请注意,计算null结果为的C表达式将导致异常,并且诸如的参数将@(null)被视为编译时错误.
对于具有已知类型的类型,也可以使用"Boxed enums"
enum {北,南,东,西,};
可以放入带盒的枚举类型@(North),它将具有值0.
盒装表达将在第3.2段开始提供.可以使用__has_feature(objc_boxed_expressions)预处理器测试对其进行测试.
NSNumber *intNumber1 = @42;
NSArray *array1 = @[@"foo", @42, @"bar", @3.14];
NSDictionary *dictionary1 = @{ @1: @"red", @2: @"green", @3: @"blue" };
Run Code Online (Sandbox Code Playgroud)
资料来源:http://blog.ablepear.com/2012/02/something-wonderful-new-objective-c.html