11

在带有 LLVM 的 Xcode 4 之前,编译器不会被注意到。条件句中的赋值是完全有意的,是 Cocoa 的习语。

选择 LLVM 编译器的 Xcode 4 永远不会抱怨,不仅仅是在编译时,只要你输入它,黄色警告图标就会出现。将警告作为错误关闭并忽略警告似乎不是一个好主意。将赋值移出括号会浪费空间。必须为每个新项目使用编译指示关闭此警告将变得乏味。

你是怎么处理的?新的成语会是什么?

4

5 回答 5

18

这实际上是一个非常古老的警告,它在 GCC 和 Clang 1.6 中默认关闭。Xcode 实际上应该给你一个关于如何修复它的建议 - 即双括号。

if ((self = [super init])) { ... }

额外的一对括号告诉编译器您确实打算在条件中进行赋值。

于 2011-02-09T01:10:18.043 回答
10

如果您从较新的 Xcode 文本宏创建 init 方法,您会注意到执行 init 的新方法是:

- (id)init {
    self = [super init];
    if (self) {
        <#initializations#>
    }
    return self;
}

这避免了警告。虽然我个人在我自己的代码中遇到这种情况,但我只是在应用 Kevin 展示的方法。

好东西知道!

于 2011-02-09T03:46:18.267 回答
4

只需使用两对括号来让编译器清楚您是故意分配的:

if ((self = [super init]))
于 2011-02-09T01:09:25.427 回答
3

调出项目导航器并选择您的项目。在出现的主窗口中,选择“全部”。在“LLVM 编译器 2.0 - 警告”部分下,选择“其他警告标志”。为“Debug”和“Release”添加标志“Wno-idiomatic-parentheses”。现在清理并重新编译。在此处输入图像描述

于 2011-03-10T19:59:20.917 回答
0

正如其他一些人建议的那样,您应该添加一组额外的括号。

我远不是一个正则表达式专家,所以可以随意清理它,但是 Xcode 中的这个查找和替换修复了我大约 95% 的实例:

Replace: if\s*\({1}\s*self\s*={1}(.*)\){1}
With:    if ((self =\1))

小心,因为这也会找到 if (self == ...),所以使用预览并取消选中这些或修复我的正则表达式:)

并开始使用 self = ...; 如果(自我),它更清洁。

于 2011-07-26T20:10:15.637 回答