OKADA LABO

swiftで一定時間ごとに、何らかの処理を行うメソッドscheduledTimer

swiftで一定時間ごとに、何らかの処理を行うためのメソッドで
scheduledTimer というのが用意されてます。
Timerクラスのメソッドです。

引数に値を入れてやると、その条件で動きます。

Timer.scheduledTimer( //TimerクラスのメソッドなのでTimerで宣言
  timeInterval: 0.1, //処理を行う間隔の秒
  target: self,  //指定した処理を記述するクラスのインスタンス
  selector: #selector(self.sayHello(_:)), //実行されるメソッド名
  userInfo: nil, //selectorで指定したメソッドに渡す情報
  repeats: true //処理を繰り返すか否か
)

@objc func sayHello(_ sender: Timer) { //(_ sender: Timer) Timerクラスのインスタンスを受け取る
    print("Hello World")
}

例えばViewController.swiftに

class ViewController: UIViewController {

    @IBAction func tapButton(_ sender: UIButton) {

        Timer.scheduledTimer(
            timeInterval: 0.1,
            target: self,
            selector: #selector(self.sayHello(_:)),
            userInfo: nil,
            repeats: true )
    }

    @objc func sayHello(_ sender: Timer) {
        print("Hello World")
    }

}

こんな風に書くと、tapButtonを押すと、
0.1秒ごとにprint("Hello World")が実行されます。
うっとおしいですね。

ちなみに、ハンドラ
@objc func XXX(){

}
に値を渡したいなら
userInfo:を設定する

class ViewController: UIViewController {

    @IBAction func tapButton(_ sender: UIButton) {
        let mylabel = UILabel()
        mylabel.text = "hoge"
        mylabel.frame.origin = CGPoint(x: self.view.frame.width, y: 200)
        mylabel.sizeToFit()
        self.view.addSubview(mylabel)

        Timer.scheduledTimer(
            timeInterval: 0.1,
            target: self,
            selector: #selector(self.sayHoge(_:)),
            userInfo: mylabel,
            repeats: true
        )

    }

    @objc func sayHoge(_ sender: Timer) {
        let hogelabel = sender.userInfo as! UILabel //sender.userInfoはmylabelのこと。 @IBAction func tapButtonのlet mylabel = UILabel() をひっぱてくる
        print("\(hogelabel.text as! String)") //mylabel.text = "hoge"のhogeを0.1秒ごとにprint
        hogelabel.frame.origin.x -= 20 //@IBAction func tapButton で発生したラベルを0.1秒ごとにx座標−20づつずらす
    }

}