11

LLVMを使用するXcode4より前は、これはコンパイラーを気付かずに通過させていました。条件内での割り当ては完全に意図的なものであり、Cocoaのイディオムです。

LLVMコンパイラが選択されたXcode4は、コンパイル時だけでなく、入力するとすぐに黄色の警告アイコンが表示されます。警告をエラーとしてオフにし、警告を無視するのは良い考えではないようです。かっこから割り当てを移動すると、スペースが無駄になります。新しいプロジェクトごとにプラグマを使用してこの警告をオフにする必要があるのは面倒です。

どのように対処していますか?新しいイディオムはどうなるのでしょうか?

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;
}

これにより、警告が回避されます。個人的には自分のコードでこれに出くわした場合でも、単にケビンが示した方法を適用しているだけです。

知っておくと便利なこと!

于 2011-02-09T03:46:18.267 に答える
4

2 組の括弧を使用して、意図的に割り当てていることをコンパイラに明確にします。

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

プロジェクト ナビゲーターを表示し、プロジェクトを選択します。表示されるメイン ウィンドウで、[すべて] を選択します。「LLVM コンパイラ 2.0 - 警告」セクションで、「その他の警告フラグ」を選択します。「デバッグ」と「リリース」の両方にフラグ「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 = ...; を使い始めます。(self) の場合は、よりクリーンです。

于 2011-07-26T20:10:15.637 に答える