始终可以使用可变参数方法调用创建 NSArray(和 NSDictionaries/NSNumber),例如:
[NSArray arrayWithObjects: @"a", @"b", @"c", nil];
可以在 LLVM 和 Clang 的新改进中使用内联文字创建这些吗?
始终可以使用可变参数方法调用创建 NSArray(和 NSDictionaries/NSNumber),例如:
[NSArray arrayWithObjects: @"a", @"b", @"c", nil];
可以在 LLVM 和 Clang 的新改进中使用内联文字创建这些吗?
通过对 LLVM 代码库的这一更改,Apple 在即将发布的 Clang 编译器版本中添加了一种新的文字语法。
以前,数组是使用基于 C 的数组创建的,并被动态转换为 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;
请注意,尽管这适用于浮点 ( @3.141F
) 和双精度数 ( @3.141
),但它不适用于long double
s,因为编译器不支持包装这些。因此,@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
最后,数组和字典现在都可以用数组括号下标,用于 aslvalue
和rvalue
表达式:
NSMutableArray* stuff = ...
id first = stuff[0];
stuff[0] = anotherObject;
NSMutableDictionary* moreStuff = ...
id conference = moreStuff[@"NSConf"]
moreStuff[@"SponsoredBy"] = @"NSConfDuck"
数组样式下标(使用 an NSUInteger
)映射到objectAtIndexedSubscript:
和对应的setObject:atIndexedSubscript:
,而字典访问使用objectForKeyedSubscript:
and访问setObject:forKeyedSubscript:
文字的完整语法可以在Clang/LLVM 网站上看到
请注意,由于最初编写了此答案,因此 Clang 添加了对称为“盒装表达式”的非文字 Objective-C 表达式的支持
这意味着可以使用as和as@(3+4)
的等价物。请注意,计算结果为的 C 表达式将导致异常,并且诸如的参数被视为编译时错误。@7
@("Hello World")
@"Hello World"
null
@(null)
也可以对已知类型的类型使用“盒装枚举”,所以
枚举{北,南,东,西,};
可以放入带有 的盒装枚举类型中@(North)
,该类型将具有值0
。
盒装表达式将从 clang 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" };
来源:http ://blog.ablepear.com/2012/02/something-wonderful-new-objective-c.html