在带有 LLVM 的 Xcode 4 之前,编译器不会被注意到。条件句中的赋值是完全有意的,是 Cocoa 的习语。
选择 LLVM 编译器的 Xcode 4 永远不会抱怨,不仅仅是在编译时,只要你输入它,黄色警告图标就会出现。将警告作为错误关闭并忽略警告似乎不是一个好主意。将赋值移出括号会浪费空间。必须为每个新项目使用编译指示关闭此警告将变得乏味。
你是怎么处理的?新的成语会是什么?
在带有 LLVM 的 Xcode 4 之前,编译器不会被注意到。条件句中的赋值是完全有意的,是 Cocoa 的习语。
选择 LLVM 编译器的 Xcode 4 永远不会抱怨,不仅仅是在编译时,只要你输入它,黄色警告图标就会出现。将警告作为错误关闭并忽略警告似乎不是一个好主意。将赋值移出括号会浪费空间。必须为每个新项目使用编译指示关闭此警告将变得乏味。
你是怎么处理的?新的成语会是什么?
这实际上是一个非常古老的警告,它在 GCC 和 Clang 1.6 中默认关闭。Xcode 实际上应该给你一个关于如何修复它的建议 - 即双括号。
if ((self = [super init])) { ... }
额外的一对括号告诉编译器您确实打算在条件中进行赋值。
如果您从较新的 Xcode 文本宏创建 init 方法,您会注意到执行 init 的新方法是:
- (id)init {
self = [super init];
if (self) {
<#initializations#>
}
return self;
}
这避免了警告。虽然我个人在我自己的代码中遇到这种情况,但我只是在应用 Kevin 展示的方法。
好东西知道!
只需使用两对括号来让编译器清楚您是故意分配的:
if ((self = [super init]))
调出项目导航器并选择您的项目。在出现的主窗口中,选择“全部”。在“LLVM 编译器 2.0 - 警告”部分下,选择“其他警告标志”。为“Debug”和“Release”添加标志“Wno-idiomatic-parentheses”。现在清理并重新编译。
正如其他一些人建议的那样,您应该添加一组额外的括号。
我远不是一个正则表达式专家,所以可以随意清理它,但是 Xcode 中的这个查找和替换修复了我大约 95% 的实例:
Replace: if\s*\({1}\s*self\s*={1}(.*)\){1}
With: if ((self =\1))
小心,因为这也会找到 if (self == ...),所以使用预览并取消选中这些或修复我的正则表达式:)
并开始使用 self = ...; 如果(自我),它更清洁。