[Xcode/Swift5] returnの後の処理が意図せず実行される「Expression following 'return' is treated as an argument of the 'return'」に注意


開発環境はXcode 12.1です。

デバッグ中、何かの拍子に処理の途中にreturnさせることがあります。

func hoge(){
    print("A")
    return
    print("B")
    print("C")
}

当然print("A")が実行されます。
で、衝撃なんですが、print("B")実行されます

なぜ??????

もっと複雑なコードの中で同様の事態に遭遇し、20分ほど悩みました。
しかし実はwarningが出ています。複雑なネストの深いコードが影響してwarningが全文表示されず、私は「当然code after 'return' will never be executedと書いてあるのだろう」と考えて読みもしなかったのですが、これが大変な内容でした。

Expression following 'return' is treated as an argument of the 'return'

つまり、returnの次の部分が返り値と解釈されるよ、とのこと。
確かに、print("B")Voidを返します。関数hogeの返り値もVoidです。ですから解釈は通ります。つまり冒頭のコードはこう解釈されていることになります。

func hoge() -> Void {
    print("A")
    return print("B")
    print("C")
}

print("B")が呼ばれるわけです。そんなつもりでコードを書いたわけではないのですが……。

warningを無視せず読み、変なところにreturnを書かず、素直にコメントアウトしよう、という気持ちになりました。