質問: Int(input) where 0 <= i && i < a.count { switch i { case 0, 1: print("残念!") case 2: print("正解!") case 3: print("・・・") default: break } break } } ``` これを実行すると readline()関数の箇所で入力を待ち受けてくれると思っていたのですが、 コンソール画面上で待ち受けている状態(プログラムは実行中)で、何となく ``` print("日本の首都は?") ``` の行に BreakPoint を設定してみると、その位置でプログラムが待ち受ける状態になりました。 あれっ?と思いそのままF6を押してみると、通常通りStep Over ができてしまい、 readLine() を待たずに再度該当の print() が実行されました。 どうしてこのような現象が起きるのでしょうか? 途中で BreakPoint を設定しなければ想定している動きになっている気がするのですが、 それが実現できているのか不安になり質問させて頂きました。
回答: そのコードをコピペして私もやってみたところ、同様の現象を確認しました。 いろいろやってみたところ、理由はちゃんと説明できないのですが、 readLine()で入力待ち中にブレークポイントを設定したり解除したりすると readLine()の入力待ちが解除され、結果がnilで返ってくるようです。 (ブレークポイントの設定/解除により、内部で何かシグナルが発生しているような雰囲気です) このため、`if let input = readLine()`で`readLine()`がnilで戻り、if文のtrueルートを実行せずwhileの先頭に戻って`print("日本の首都は?")`のブレークポイントで停止する動きとなります。 `if let input = readLine()`のelseルートにprint()を埋め込んで実行すると動きがわかりやすいと思います。