Dod*_*n86 3 xcode ios core-motion swift ios8
我正在尝试将obj-c中构建的旧游戏应用程序转换为新的swift代码.我有一些问题了解swift闭包以及如何在"startAccelerometerUpdatesToQueue"方法中使用它们.
我已经用这种方式初始化了运动管理器
motionManager!.accelerometerUpdateInterval = (1/40)
Run Code Online (Sandbox Code Playgroud)
然后在我的视图控制器的viewdidload中
var queue:NSOperationQueue
motionManager?.startAccelerometerUpdatesToQueue(queue, withHandler: {(accelerometerData : CMAccelerometerData, error : NSError) in
})
Run Code Online (Sandbox Code Playgroud)
"startAccelerometerUpdatesToQueue"给了我一个错误,我很确定我不理解正确的闭包语法.
有任何想法吗?
实际上,你只是签名错误 - 你的闭包的参数需要是选项(因为它们是从Objective-C传递的,它们可能是nil).因此,您提供的参数与现有方法签名不匹配,因此您会收到错误.
看看iOS 8 API文档,它们还提供Swift签名:
func startAccelerometerUpdatesToQueue(_ queue: NSOperationQueue!,
withHandler handler: CMAccelerometerHandler!)
Run Code Online (Sandbox Code Playgroud)
并被CMAccelerometerHandler定义为
typealias CMAccelerometerHandler = (CMAccelerometerData!, NSError!) -> Void
Run Code Online (Sandbox Code Playgroud)
因此,您的电话应该是:
motionManager?.startAccelerometerUpdatesToQueue(queue, withHandler: {(accelerometerData : CMAccelerometerData!, error : NSError!) in
})
Run Code Online (Sandbox Code Playgroud)
和任何以闭包作为最后一个参数的函数/方法一样,你可以将它从参数列表中删除并在调用后写入它(尾随闭包语法 - 这个例子也省略了类型,因为它们可以被推断出来,但这是可选的):
motionManager?.startAccelerometerUpdatesToQueue(queue) { accelerometerData, error in
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3689 次 |
| 最近记录: |