質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

3299閲覧

Swift2.2: 標準入力の readline() について

退会済みユーザー

退会済みユーザー

総合スコア0

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2016/05/10 09:30

Swift 2.2 (Xcode7.3.1, OSX 10.11.4)でコマンドラインツールを作成しています。
エラーではないのですが、デバッグ中に不思議な動きがあったため質問させて頂きます。
プログラムの内容は下記です。

1.何らかの質問を print() で表示
2.標準入力の readLine() 関数で待ち受け
3.用意した選択肢のいずれかを選んだら終了
3.それ以外の入力があった場合は再度同じ質問を表示する

###該当のソースコード

Swift2.2

1let a = ["北海道", "大阪", "東京", "あきらめる"] 2while true { 3 4 print("日本の首都は?") 5 for (id, v) in a.enumerate() { 6 print("\(id): \(v)") 7 } 8 9 if let input = readLine(), i = Int(input) where 0 <= i && i < a.count { 10 switch i { 11 case 0, 1: print("残念!") 12 case 2: print("正解!") 13 case 3: print("・・・") 14 default: break 15 } 16 break 17 } 18}

これを実行すると readline()関数の箇所で入力を待ち受けてくれると思っていたのですが、
コンソール画面上で待ち受けている状態(プログラムは実行中)で、何となく

Swift2.2

1print("日本の首都は?")

の行に BreakPoint を設定してみると、その位置でプログラムが待ち受ける状態になりました。
あれっ?と思いそのままF6を押してみると、通常通りStep Over ができてしまい、
readLine() を待たずに再度該当の print() が実行されました。

どうしてこのような現象が起きるのでしょうか?
途中で BreakPoint を設定しなければ想定している動きになっている気がするのですが、
それが実現できているのか不安になり質問させて頂きました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのコードをコピペして私もやってみたところ、同様の現象を確認しました。

いろいろやってみたところ、理由はちゃんと説明できないのですが、
readLine()で入力待ち中にブレークポイントを設定したり解除したりすると
readLine()の入力待ちが解除され、結果がnilで返ってくるようです。
(ブレークポイントの設定/解除により、内部で何かシグナルが発生しているような雰囲気です)

このため、if let input = readLine()readLine()がnilで戻り、if文のtrueルートを実行せずwhileの先頭に戻ってprint("日本の首都は?")のブレークポイントで停止する動きとなります。

if let input = readLine()のelseルートにprint()を埋め込んで実行すると動きがわかりやすいと思います。

投稿2016/05/10 12:21

編集2016/05/10 23:56
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/12 11:57

コメントありがとうございます! 動きについてはすごく納得できました。確かにelseルートに入ってきますね。 if let だけでなく guard でもやはり入ってきますね。 言われてみると、全く別のプログラムを作っているときも、ブレークポイントの設定/解除をしていると signal 〜 という エラーが起きて意味が分からず無視した事があったかもしれません。 ただ今回のプログラムをビルドしてできた実行ファイルについては、 何度実行してもデバッグ時のような不思議な動きはしませんでした。 なので、この問題は解決という事にしてしまいます! また宜しくお願いします!
TakeOne

2016/05/12 13:32

はい。この動作自体はデバッガーの動作の影響によるものと考えられますので、通常の実行をする上では問題ないと思います。そのことを回答に明記するのを忘れていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問