メニューを閉じる

テクノデジタルグループ

メニューを開く

2017.10.17

プログラミング

swiftのforEachはreturnで抜けられない

坂東です。

仕様がコロコロ変わったり、「?」とか「!」とか、Swiftは好きじゃありません。
Swiftの forEach と return 文でハマったので書きます。

Swift4では誰の趣味かわからないですが、C言語スタイルのfor(  i=0 ;i <10  ; i++  )文が廃止されました。
代わりに、こう書きます。

for i in (0 ..< 10) {
  print(i)
}

 

for( i = 0; i < 10;  i +=2  ) はどう書くんだとググったらこう書くようです。変なの。

stride(from:0, to: 10, by: 2).forEach {
  print($0)
}

 

ループしながら特定の値を見つけたら終了する、こういうロジックを書きました。

func hoge() {
  stride(from:0, to: 10, by: 2).forEach {
    print($0)
    if( $0 > 5) {
      return;
    }
   print($0)
}

すると結果はこんな感じで、

0
0
2
2
4
4
6  ←ここでreturnで抜けるはず
8 ←なんで続くの

returnで関数を抜けないんです。strideが継続するんです。
ループ内の return って Swift4 じゃ continue と同じ意味になったの?と思って、
for文で試すと意図したとおりに抜けます

  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 の書き方サンプルが見つかって、こっちは意図通りです。

  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 があるのでよくわかり、これなら間違えない。

forループ内とforEach内では挙動が違う

participants.forEach(function (participant) {
  if(participant.id == myID) {
    return true;
  }
})

 

嫌いだからって事実じゃない思い込みで批判するのはやめようという話でした。

おわり。

 


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事