You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode 9.2升级后CMMotionManager报错:无法转换闭包参数类型

解决Xcode9.2中CMMotionManager闭包类型不匹配的问题

嘿,这个问题我之前升级Swift版本时也踩过坑!核心原因是Xcode9.2对应的Swift版本(Swift 4)里,Core Motion框架的API做了类型适配——原来闭包里的NSError?参数已经被替换成了Swift原生的Error?,这就导致你的旧代码出现了类型转换错误。

修改后的正确代码

只需要把闭包里的NSError?改成Error?就可以解决问题,顺便我还把旧的M_PI换成了Swift原生的.pi(新版本推荐写法):

func startCameraTracking() {
    motionManager.deviceMotionUpdateInterval = 1.0 / 60.0
    motionManager.startDeviceMotionUpdatesToQueue(OperationQueue.main) { [weak self](data: CMDeviceMotion?, error: Error?) in
        guard let data = data else {
            // 如果需要处理错误,可以在这里补充逻辑
            if let error = error {
                print("设备运动更新出错:\(error.localizedDescription)")
            }
            return
        }
        let attitude: CMAttitude = data.attitude
        self?.cameraNode.eulerAngles = SCNVector3Make(
            Float(attitude.roll + .pi/2.0),
            -Float(attitude.yaw),
            -Float(attitude.pitch)
        )
    }
}

补充说明

从Swift 3开始,苹果就逐步把Objective-C风格的NSError替换成了Swift原生的Error协议,Core Motion这类系统框架也同步更新了API签名。你之前的代码是适配旧版Swift(比如Swift 2.x)的写法,升级Xcode后自然会出现类型不兼容的问题。

内容的提问来源于stack exchange,提问作者viperx21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:26:58