可选类型 'NSOperationQueue?' 的值未展开

Value of optional type 'NSOperationQueue?' not unwrapped

我正在研究 Core Motion Swift 找到教程 here

但是,我得到一个错误:

Value of optional type 'NSOperationQueue?' not unwrapped; did you mean to use '!' or '?'?

当我插入 '!' 时按照建议,我收到另一个错误:

Cannot convert value of type'(CMAccelerometerData!, NSError!) -> Void' to expected argument type 'CMAccelerometerHandler' (aka 'Optional , Optional) -> ()')

这是代码:

     motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(),
        withHandler: { (accelerometerData: CMAccelerometerData!, error: NSError!) -> Void in self.outputAccelerationData(accelerometerData.acceleration)
            if (error != nil) {
                print("\(error)")
            }
    })

     motionManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:
        { (gyroData: CMGyroData!, error: NSError!) -> Void in
            self.outputRotationData(gyroData.rotationRate)
            if (error != nil) {
                print("\(error)")
            }
    })

我正在尝试学习 Core Motion,这些错误让我很困惑。

我该如何解决这个问题?

这与 Core Motion 无关,它是错误的 Swift 代码。我建议你学习一下 Swift optional。这是一个很好的来源:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html

现在,关于您的代码:gyroData 是可选的,因此不要将 ! 放在闭包中的参数前面,使用这个:

if let gData = gyroData {
   ...
}

所以像这样:

motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(),
    withHandler: { (accelerometerData, error) -> Void in self.outputAccelerationData(accelerometerData.acceleration)
        if let x = accelerometerData {
            // now x is your unwrapped accelerometerData
        }
})