2024.03.07
イベントの感想募集でGoogleフォーム使ってみたら便利だった
2017.10.17
プログラミングswiftのforEachはreturnで抜けられない
坂東です。
仕様がコロコロ変わったり、「?」とか「!」とか、Swiftは好きじゃありません。
Swiftの forEach と return 文でハマったので書きます。
Swift4では誰の趣味かわからないですが、C言語スタイルのfor( i=0 ;i <10 ; i++ )文が廃止されました。
代わりに、こう書きます。
|
1 2 3 |
for i in (0 ..< 10) { print(i) } |
for( i = 0; i < 10; i +=2 ) はどう書くんだとググったらこう書くようです。変なの。
|
1 2 3 |
stride(from:0, to: 10, by: 2).forEach { print($0) } |
ループしながら特定の値を見つけたら終了する、こういうロジックを書きました。
|
1 2 3 4 5 6 7 8 |
func hoge() { stride(from:0, to: 10, by: 2).forEach { print($0) if( $0 > 5) { return; } print($0) } |
すると結果はこんな感じで、
|
1 2 3 4 5 6 7 8 |
0 0 2 2 4 4 6 ←ここでreturnで抜けるはず 8 ←なんで続くの |
returnで関数を抜けないんです。strideが継続するんです。
ループ内の return って Swift4 じゃ continue と同じ意味になったの?と思って、
for文で試すと意図したとおりに抜けます
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
for i in (0 ..< 10) { print($0) if( $0 > 5) { return; } print($0) } 結果 0 1 1 2 2 3 3 4 4 5 5 6 |
もういっこ stride の書き方サンプルが見つかって、こっちは意図通りです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
for i in stride(from: 0, to: 10, by: 2) { print(i) if( i > 5) { return; } print(i) 結果 0 0 2 2 4 4 6 |
Swiftバグってんじゃんバーカと思ったら、forEach文の中身ってあくまで関数で、returnはループ内の関数を抜けるだけでループ自体は継続するんですね。
なんだか説明が下手くそですが、javascript の forEach だと中身に function があるのでよくわかり、これなら間違えない。
|
1 2 3 4 5 |
participants.forEach(function (participant) { if(participant.id == myID) { return true; } }) |
嫌いだからって事実じゃない思い込みで批判するのはやめようという話でした。
おわり。
【記事への感想募集中!】
記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!【テクノデジタルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索
SNS共有