在 Swift 下使用 startDeviceMotionUpdates 3

Using startDeviceMotionUpdates under Swift 3

是的,我已经看到了 ,但我仍然无法让它工作。我以前的 Swift2 代码是...

motionMgr.startDeviceMotionUpdatesToQueue(NSOperationQueue(), withHandler: handleMove)

调用了:

func handleMove(motion: CMDeviceMotion?, error: NSError?) {
    ...
}

这在 Swift3 下已经改变,现在 startDeviceMotionUpdatesToQueue 使用闭包。我一辈子都想不出如何调用我现有的方法。我意识到 NSError 变成了 Error 和其他小的变化,但是闭包调用的语法让我很困惑。

这应该适合你,Swift 3.

中只有一些重命名
motionMgr.startDeviceMotionUpdates(to: OperationQueue(), withHandler: handleMove)

func handleMove(motion: CMDeviceMotion?, error: Error?) {
    // ...
}

handler 属于 CMDeviceMotionHandler 类型,它被定义为 typealias 闭包:

typealias CMDeviceMotionHandler = (CMDeviceMotion?, Error?) -> Void

我们只需要提供一个闭包(或函数,因为函数是一个闭包),它接受两个参数(CMDeviceMotion?Error?)和 returns什么都没有 (Void).

或者,您可以提供闭包而不是像这样的函数:

motionMgr.startDeviceMotionUpdates(to: OperationQueue(), withHandler: { deviceMotion, error in
    // ...
})

或使用新的尾随闭包语法:

motionMgr.startDeviceMotionUpdates(to: OperationQueue()) { deviceMotion, error in
    // ...
}