gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:44:39 24 4
gpt4 key购买 nike

始终可以使用可变参数方法调用创建 NSArray(和 NSDictionaries/NSNumber),例如:

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

是否可以在 LLVM 和 Clang 的新改进中使用内联文字创建这些?

最佳答案

this change在 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;

请注意,虽然这适用于 float (@3.141F) 和 double (@3.141),但它不适用于 long double s,因为编译器不支持包装这些。因此,@3.141D将是编译时错误。

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

还有 bool 类型的扩展:

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) 的保护。在预处理器中,但开发人员应继续使用 YESNO在代码中。

最后,数组和字典现在都可以用数组括号来下标,在使用时都作为lvaluervalue表达式:

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 website 中查看文字的完整语法。

请注意,自从最初编写此答案以来,Clang 已添加对称为“盒装表达式”的非文字 Objective-C 表达式的支持

这意味着可以使用 @(3+4)相当于 @7 , 和 @("Hello World")作为 @"Hello World" .请注意,计算结果为 null 的 C 表达式将导致异常,并且参数如 @(null)被视为编译时错误。

对于已知类型的类型也可以使用“盒装枚举”,所以

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

可以使用 @(North) 放入盒装枚举类型中,其值为 0 .

盒装表达式将在 clang 3.2 及以后版本中可用。可以使用 __has_feature(objc_boxed_expressions) 进行测试预处理器测试。

关于objective-c - Objective-C 中是否有一些文字字典或数组语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com