我很难让语法正确地在Swift中返回滚动,俯仰,偏航。加速度计都工作正常但不能排除这一点。这是材料代码:
var roll: Double = 0.0
var pitch: Double = 0.0
var yaw: Double = 0.0
var manager = CMMotionManager()
override func viewDidLoad() {
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (rpyData: CMDeviceMotionHandler?, NSError) -> Void in self.outputRPY(rpyData!.deviceMotion)
if(NSError != nil) {
print("\(NSError)")
}
})
}
func outputRPY(data: CMDeviceMotion){
roll = data.attitude.roll
pitch = data.attitude.pitch
yaw = data.attitude.yaw
rollLabel.text = String(format: "%.2f°", roll)
pitchLabel.text = String(format: "%.2f°", pitch)
rollLabel.text = String(format: "%.2f°", yaw)
}
答案 0 :(得分:1)
第二个参数类型应该是NSError? (Aka是可选的)并且在闭包的主体中,您将类型与值进行比较。
总之,它应该是这样的:
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (deviceMotion: CMDeviceMotion?, err: NSError?) -> Void in
self.outputRPY(deviceMotion!)
if(err != nil) {
print("\(err)")
}
}
您还可以使用可选绑定更快捷......:)
if error = err {
print("\(error)")
}
修改强>:
在家用机器上测试后,我意识到还有一个问题。 CMDeviceMotionHandler
声明闭包的类型(或函数指针,如果你愿意的话)。它被声明为:
public typealias CMDeviceMotionHandler = (CMDeviceMotion?, NSError?) -> Void
所以你的闭包(或处理程序)应该是这样的:
{ (deviceMotion: CMDeviceMotion?, error: NSError?) -> Void in
// code goes here
}
最后,你的第二个参数是使标识符NSError
引用变量,当它已经是一个类型(合法)时。我个人不会这样命名,因为它很容易与类型NSError
混淆。也许您可以将其命名为nserror
,这样可以避免与现有类型混淆。
第一个代码段应该只是复制粘贴到您的项目中。
答案 1 :(得分:0)
让我感到震惊的是,Roll,Pitch,Yaw似乎与加速度计,陀螺仪,磁力计的工作方式不同。这是新闻代码的新鲜内容:
var manager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
manager.deviceMotionUpdateInterval = 0.2
manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: {(motionData: CMDeviceMotion?, NSError) -> Void in self.outputRPY(motionData!)
if (NSError != nil){
print("\(NSError)")
}
})
}
func outputRPY(data: CMDeviceMotion){
let rpyattitude = manager.deviceMotion!.attitude
roll = rpyattitude.roll * (180.0 / M_PI)
pitch = rpyattitude.pitch * (180.0 / M_PI)
yaw = rpyattitude.yaw * (180.0 / M_PI)
rollLabel.text = String(format: "%.2f°", roll)
pitchLabel.text = String(format: "%.2f°", pitch)
yawLabel.text = String(format: "%.2f°", yaw)
}