開発環境は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
を書かず、素直にコメントアウトしよう、という気持ちになりました。