Core Motion Swift Closure问题

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"给了我一个错误,我很确定我不理解正确的闭包语法.

有任何想法吗?

Luk*_*kas 7

实际上,你只是签名错误 - 你的闭包的参数需要是选项(因为它们是从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)