Swift NSTimer 将 userInfo 检索为 CGPoint

Posted

技术标签:

【中文标题】Swift NSTimer 将 userInfo 检索为 CGPoint【英文标题】:Swift NSTimer retrieving userInfo as CGPoint 【发布时间】:2014-11-25 17:40:05 【问题描述】:
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 不是对象(至少在 Cocoa API 起源的 Objective-C 世界中)。它必须包装在 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")

【讨论】:

如果某个答案解决了您的问题,您可以将其标记为已接受:***.com/help/someone-answers。

以上是关于Swift NSTimer 将 userInfo 检索为 CGPoint的主要内容,如果未能解决你的问题,请参考以下文章

NSTimer - 如何在 Swift 中延迟

NSTimer - 如何在Swift中延迟

在 Swift 中更改计时器选择器函数中的 userInfo

使用 NSTimer 时如何更改 userInfo 中的数据?

如何在 Swift 中声明类级函数?

错误无法下标“AnyObject?”类型的值在 NSTimer 的 userInfo 中使用数组