【问题标题】:Unboxed BOOLs in Objective-C literal syntax giving errorObjective-C 文字语法中未装箱的 BOOL 给出错误
【发布时间】:2012-09-03 11:53:36
【问题描述】:

我只是在试验作为 Xcode 4.4 的一部分引入的新的 Objective-C 文字语法。

字典、整数和数组都可以正常工作,但我在让BOOLs 工作时遇到了问题。例如:

NSDictionary *myDict = @{
    @"foo": @"bar",
    @"test": @YES
};

“意外的类型名称 'BOOL': 预期的表达式” 在布尔值的行上。

但是,@(YES)@1@true 都可以正常工作。

这篇文章:http://clang.llvm.org/docs/ObjectiveCLiterals.html 建议 @YES 应该可以工作。

我也在自己的线路上尝试过:NSNumber *myNum = @YES; 并得到同样的错误。

错误?!

【问题讨论】:

  • [troll]xcode == bug[/troll]。但是是的,这似乎是一个错误,很奇怪...... Xcode 4.4 后面的 clang 版本是什么?你确定你使用的是 clang 而不是 gcc 吗?
  • 列出的编译器是“Apple LLVM 编译器 4.0”。奇怪的是它大部分有效!还尝试了该页面上还提到的“对象订阅”,但它不起作用,但也许这是因为 Apple 需要通过为 NSDictionary 等添加对 [] 运算符的支持来在其 SDK 中支持它。(尚未尝试使用 iOS 6 SDK)

标签: objective-c xcode4 objective-c-literals


【解决方案1】:

这不是错误,这是因为 Apple 目前有

#define YES (BOOL)1
#define NO  (BOOL)0

而不是

#define YES ((BOOL)1)
#define NO  ((BOOL)0)

在最新的 SDK 中已修复。

【讨论】:

  • 实际上,bool 在新的 SDK 中拥有自己的类型,_objc_bool。
【解决方案2】:

BOOL 文字依赖于定义为 iOS 或 Mac SDK 一部分的新语言关键字,因此较旧的 SDK(包括 iOS 5.1)没有它,因此必须使用装箱符号 - 即 @(YES)

正如我在上面的评论中提到的,我的猜测是对象下标也是如此。

(使用来源回答我自己的问题:http://jamesdempsey.net/2012/07/30/moving-to-new-objective-c-literals/

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 2014-03-26
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2015-03-10
    • 2011-01-07
    • 2013-10-21
    相关资源
    最近更新 更多