web-dev-qa-db-ja.com

SwiftでNSTimerによって呼び出されるメソッドにパラメーターを渡す

コードでNSTimerによって呼び出されるメソッドに引数を渡そうとしています。例外をスローしています。これが私のやり方です。 Circleは私のカスタムクラスです。

    var circle = Circle()
    var timer = NSTimer.scheduledTimerWithInterval(1.0, target: self, selector: animate, userInfo: circle, repeats: true)

以下は呼び出されているメソッドです

    func animate(circle: Circle) -> Void{
      //do stuff with circle
    }

注:このメソッドは、呼び出されているクラスと同じクラスにあります。だから私はターゲットを正しく設定したと思います。

21
Raghu

NSTimerで使用するセレクターは、NSTimerオブジェクトが唯一のパラメーターであるため、それに渡されます。サークルオブジェクトをその中にuserInfoとして置き、タイマーが作動したときにそれを抽出できます。

var circle = Circle()
var timer = NSTimer.scheduledTimerWithInterval(1.0, target: self, selector: "animate:", userInfo: circle, repeats: true)

func animate(timer:NSTimer){
  var circle = timer.userInfo as Circle
  //do stuff with circle
}
40
Andy

セレクタは、ivarであると想定されていない限り、文字列である必要があります。また、animate関数の署名が間違っています。次の変更により、再び移動できるはずです。

_var circle = Circle()
var timer = NSTimer.scheduledTimerWithInterval(1.0, target: self, selector: "animate", userInfo: circle, repeats: true)

func animate(circle: Circle) -> () {
  //do stuff with circle
}
_

関数は実際には空のタプルを返す必要はありません。 -> ()なしで書くことができます

「Selector()」メソッドでラップされたセレクター文字列Selector("animate")も見ました。どちらの方法でも機能します。

私は自分でNSTimerとクロージャをいじって、それに関する記事を書きました: NSTimerでSwiftのクロージャを使用する

0
samullen