Swift NSTimer, извлекающий пользовательскую информацию как CGPoint

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touch = touches.anyObject() as UITouch
    let touchLocation = touch.locationInNode(self)

    timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "shoot", userInfo: touchLocation, repeats: true) // error 1
}

func shoot() {
    var touchLocation: CGPoint = timer.userInfo // error 2
    println("running")
}

Я пытаюсь создать таймер, который периодически запускается, который передает точку прикосновения (CGPoint) как userInfo в NSTimer, а затем обращается к нему через функцию shoot(). Тем не менее, сейчас я получаю сообщение об ошибке

1) дополнительный аргумент селектора в вызове

2) не может преобразовать тип выражения AnyObject? В CGPoint

В данный момент я не могу передать userInfo другой функции и затем извлечь ее.

1 ответ

Решение

К несчастью CGPoint не является объектом (по крайней мере, в мире Objective-C, из которого происходят API-интерфейсы Какао). Это должно быть завернуто в NSValue объект для помещения в коллекцию.

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touch = touches.anyObject() as UITouch
    let touchLocation = touch.locationInNode(self)
    let wrappedLocation = NSValue(CGPoint: touchLocation)

    timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "shoot:", userInfo: ["touchLocation" : wrappedLocation], repeats: true)
}

func shoot(timer: NSTimer) {
    let userInfo = timer.userInfo as Dictionary<String, AnyObject>
    var touchLocation: CGPoint = (userInfo["touchLocation"] as NSValue).CGPointValue()
    println("running")
}
Другие вопросы по тегам