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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3129閲覧

Swift ループの仕組みがわからない

earnest_gay

総合スコア615

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/09/12 13:38

Swiftでサンプルアプリ作っています。
とりあえず、全部やってみた後で色々考えた結果、1つ分からないことがあります。

あ、まずはコードです。

// // ViewController.swift // Sample001 // // Created by ####### on 2016/09/12. // Copyright © 2016年 Jwebgate. All rights reserved. // import UIKit class ViewController: UIViewController { @IBOutlet weak var resultLabel: UILabel! @IBOutlet weak var signalImageView: UIImageView! var blueImage:UIImage! var yellowImage:UIImage! var redImage:UIImage! override func viewDidLoad() { super.viewDidLoad() blueImage = UIImage(named:"signal_blue.png") yellowImage = UIImage(named:"signal_yellow.png") redImage = UIImage(named:"signal_red.png") signalImageView.image = redImage } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func BlueBtnPushed(sender: AnyObject) { if signalImageView.image == blueImage { resultLabel.text = "せいかい!" } else { resultLabel.text = "まちがい!" } resultLabel.textColor = UIColor.blueColor(); randomSignal() } @IBAction func YellowBtnPushed(sender: AnyObject) { if signalImageView.image == yellowImage { resultLabel.text = "せいかい!" } else { resultLabel.text = "まちがい!" } resultLabel.textColor = UIColor.yellowColor(); randomSignal() } @IBAction func RedBtnPushed(sender: AnyObject) { if signalImageView.image == redImage { resultLabel.text = "せいかい!" } else { resultLabel.text = "まちがい!" } resultLabel.textColor = UIColor.redColor(); randomSignal() } func randomSignal() { let randomNumber = arc4random() % 3 if randomNumber == 0 { signalImageView.image = blueImage } else if randomNumber == 1 { signalImageView.image = yellowImage } else { signalImageView.image = redImage } } }

こんな感じのものです。

イメージ説明
イメージ説明

各ボタンを押した時の処理の最後で、
表示されるべき信号の画像が乱数によって変わっていることはわかります。

私はプログラムを上から読んでいきます。
これは私の感覚ですが、
for文とか使っているわけでもないのに画像が切り替わることに違和感があります。
別に何回繰り返すとかいう条件のようなプログラムはどこにも書いていません。

ただ、各ボタンのメソッドの最後で、最初に表示させたsignalImageView.imageを書き換えているだけです。
ループする条件なんかはありません。

これはなぜループしているのでしょうか?
ループと言う表現が混乱を招いているのでしょうか。

ここだけがモヤっとしています。
疲れているだけで翌日見たら「あ〜そういうことか」なんてことはよくありますが、解説できる方お願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

iOSアプリケーションなどたいていのGUIプログラムのフレームワークにはイベントループという仕組みが備わっています。
iOSではランループ(NSRunLoopまたはCFRunLoop)と言います。

このランループがアプリケーションの一番外側で無限ループしてイベントを待ち受けています。なので自分でループを作成する必要はないのです。

ランループは無限ループしつつ、タッチなどのイベントを受け取ったらイベントハンドラを呼び出して(iOSの場合、UIApplicationまたはUIWindowが最初にすべてのイベントを受けて、適切なビューやボタンにディスパッチします)例のコードの場合、ボタンを押したというイベントは最終的に〜BtnPushedを呼び出します。それ以外のイベントは処理していないので無視されます。イベントが処理されたらランループはまた次のイベントが起こるのを待機します。

これが自分でループを作成しているわけでもないのに、処理が繰り返される仕組みです。

興味があれば、ランループやイベントループで検索するといいです。

投稿2016/09/12 14:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2016/09/12 14:16

そういうことでしたか! Swift特有の仕様みたいなものなのですね。 ありがとうございます!
退会済みユーザー

退会済みユーザー

2016/09/12 16:51

Swift特有というかランループはCocoa(iOS/OS Xのフレームワーク)の仕様で、イベントループ(ランループはイベントループの一種)はGUIプログラミングでは一般的なものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問