コードで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
}
注:このメソッドは、呼び出されているクラスと同じクラスにあります。だから私はターゲットを正しく設定したと思います。
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
}
セレクタは、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のクロージャを使用する