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

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

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

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

Q&A

解決済

1回答

2596閲覧

Swift3 selectorの引数を参照渡ししたい

ssssskkkkk

総合スコア20

Swift

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

0グッド

0クリップ

投稿2017/07/07 22:37

###Swift3 selectorの引数を参照渡ししたい

Timer.scheduledTimerで呼び出し元の値(別のクラスから呼び出しています)を変更したいと考えています。
また、呼び出し元の値を変更するコードも別のクラスに定義しています。

クラス内容
ViewController変更したい値a,bを保持しています
PosTimerCalcにa,bを渡すコードを記述しています(ここで参照渡しをしたい)
Calc実際に、a,bの値を変更するコードを記述しています

###発生している問題

以下のようなコードを書いてみたのですが、呼び出し元のViewContorollerクラスでのa,bの値は変化していませんでした。

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

lang

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 let posTimer = PosTimer() 7 let calc = Calc() 8 9 // このa,bの値を変更したい 10 var a = 1 11 var b = 1 12 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 posTimer.StartTimer(a: &a, b: &b, calc: calc) 18 19 } 20 21 override func didReceiveMemoryWarning() { 22 super.didReceiveMemoryWarning() 23 24 25 } 26 27} 28 29

lang

1 2import UIKit 3 4 5class PosTimer: NSObject { 6 7 var posTimer: Timer? 8 9 func StartTimer(a: inout Int, b: inout Int, calc: Calc) { 10 11 let dic = ["a": a, "b": b, "calc": calc] as [String : Any] 12 13 // ここでUpdateにa,bを参照渡ししたい 14 posTimer = Timer.scheduledTimer( 15 timeInterval: 1, 16 target: self, 17 selector: #selector(UpDate), 18 userInfo: dic, 19 repeats: true 20 ) 21 22 23 } 24 25 func UpDate(timer: Timer) { 26 27 let userInfo = timer.userInfo as! [String: Any] 28 var a = userInfo["a"] as! Int 29 var b = userInfo["b"] as! Int 30 let calc = userInfo["calc"] as! Calc 31 32 // ここで参照渡しされたa,bをcalcに渡して値を変更したい 33 calc.IncNum(a: &a, b: &b) 34 35 } 36 37} 38

lang

1 2import UIKit 3 4class Calc: NSObject { 5 6 // 参照渡しされたa,bの値を変更する 7 func IncNum(a: inout Int, b: inout Int) { 8 9 a += 1 10 b += 1 11 12 } 13 14} 15 16 17

ご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 let posTimer = PosTimer() 6 let calc = Calc() 7 8 // このa,bの値を変更したい 9 var a = 1 10 var b = 1 11 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 posTimer.startTimer() { [weak self] in 17 18 guard let `self` = self else { return } 19 20 (self.a, self.b) = self.calc.incNum(a: self.a, b: self.b) 21 } 22 23 } 24 25 override func didReceiveMemoryWarning() { 26 super.didReceiveMemoryWarning() 27 28 29 } 30 31}

swift

1import UIKit 2 3 4class PosTimer: NSObject { 5 6 var fireHandeler: (() -> ())? 7 8 var posTimer: Timer? 9 10 func startTimer(_ f: @escaping () -> ()) { 11 12 fireHandeler = f 13 14 // ここでUpdateにa,bを参照渡ししたい 15 posTimer = Timer.scheduledTimer( 16 timeInterval: 1, 17 target: self, 18 selector: #selector(upDate), 19 userInfo: nil, 20 repeats: true 21 ) 22 23 } 24 25 func upDate(timer: Timer) { 26 27 fireHandeler?() 28 29 } 30 31}

swift

1class Calc: NSObject { 2 3 // 参照渡しされたa,bの値を変更する 4 func incNum(a: Int, b: Int) -> (Int, Int){ 5 6 return (a + 1, b + 1) 7 8 } 9 10}

実行確認してないので申し訳ないですが、こんなかんじでしょうか?

実行して欲しい関数(クロージャ)をPosTimerに渡して実行してもらう、というやり方です。

細かいことですが、関数の頭文字は小文字にしましょう。

また、inoutはやめてタプルを返すようにしました。

投稿2017/07/08 03:33

編集2017/07/08 03:34
MasakiHori

総合スコア3384

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

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

ssssskkkkk

2017/07/09 07:26

教えていただいた通りに実装し、思い描いていたことを実現できました。 命名規則に関しては、コーディング規約などを読み勉強したいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問