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")
}