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

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

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

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

Swift

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

Q&A

解決済

1回答

306閲覧

引数の値が変更できず、スロットが止まらない。

Dave

総合スコア22

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/05/30 01:54

MacOS Catalina 10.15.4
Xcode 11.5 beta
Swift version 4

簡単なスロットアプリを作っています。
1秒毎にスロットが回って7つある画像を順番に表示し、ストップボタンを押せば止まるような仕組みを想定しています。
以下のようにcheckをBool値で設定し、trueの間は回り続け、ストップボタンを押せばflaseに変わって止まるようにしたいです。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var image1: UIImageView! 6 var check1 = true 7 var picarray:[UIImage] = [] 8 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 // UIImage インスタンスの生成 14 let pic1:UIImage = UIImage(named:"pic1")! 15 let pic2:UIImage = UIImage(named:"pic2")! 16 let pic3:UIImage = UIImage(named:"pic3")! 17 let pic4:UIImage = UIImage(named:"pic4")! 18 let pic5:UIImage = UIImage(named:"pic5")! 19 let pic6:UIImage = UIImage(named:"pic6")! 20 let pic7:UIImage = UIImage(named:"pic7")! 21 22 picarray = [pic1, pic2, pic3, pic4, pic5, pic6, pic7] 23 24 25 // UIImageView 初期化 26 image1.image = pic1 27 28 move(image: image1, check: check1) 29} 30 31 func move(image: UIImageView, check: Bool){ 32 if check == true{ 33  if n >= 7{ n = 0 } 34 image.image = picarray[n] 35 n += 1 36 37 DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 38 39 self.move(image: image, check: check) 40 } 41 } 42 } 43 44 @IBAction func stop1(_ sender: Any) { 45 check1 = false 46 }

ただ、ボタンを押してcheck1 = falseにしても次の1秒には```true

この記述だと```move()```に渡した```check1```は```true```のまま値は変わらないのでしょうか。 (試しに```func move()```中のcheckを引数ではなく```check1```に変えると、ボタンを押せばスロットが期待通り止まります。) ストップボタンは他にも複数あり、できたら汎用性の高い一つの```func```で表したいです。 初心者でコードが汚く恐縮ですが、記述の仕方に誤りなどありましたらご教示頂けると幸いです。 お手数ですが、宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1move(image: image1, check: check1)

関数の引数はコピー渡しですので、ここで渡されたcheck1と、関数の仮引数であるcheckはもはや別の実体(インスタンス)となってしまいます。

したがって、

Swift

1 @IBAction func stop1(_ sender: Any) { 2 check1 = false 3 }

ここでcheck1の値を変更しても、その値は`move()`という関数の中には反映されません。

したがって

試しにfunc move()中のcheckを引数ではなくcheck1に変えると、ボタンを押せばスロットが期待通り止まります。

のように、check1を直接参照するようにすれば期待通りの動きとなります。

inoutを使えば参照渡しにすることは可能ですが管理が面倒になりそうなので、別のロジックを考えた方がいいかもしれません(想像だけですが、クラスや構造体を作って1つのスロットを1つのインスタンスにすれば管理は色々楽になるかもしれません)。

投稿2020/05/30 02:58

TsukubaDepot

総合スコア5086

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

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

Dave

2020/05/30 03:50

早速ご回答頂きありがとうございます。 値型と参照型の違い…というものでしょうか。 コピーされるので元の値を変更しても反映されないんですね。勉強になります。 動かすだけなら関数だけでなんとかなりそうですが、これを機にクラスや構造体を試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問