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

Swift 2转Swift 4:加速度计与物理世界重力代码适配问题

Swift 2 转 Swift 4 代码解决方案

嘿,我来帮你把这两段代码转换成Swift 4的兼容版本,顺便说明下改动的细节,避免以后遇到类似问题~

1. CMMotionManager 加速度更新代码转换

Swift 2 原代码

let manager = CMMotionManager() 
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue()) { (data, error) in }

Swift 4 转换后代码

let manager = CMMotionManager()
manager.startAccelerometerUpdates(to: OperationQueue.main) { (data, error) in
    // 在这里添加你的加速度数据处理逻辑
}

改动说明

  • 命名规范调整:NSOperationQueue 在Swift 3+中被简化为OperationQueue,去掉了Objective-C风格的NS前缀
  • 类方法转静态属性:mainQueue() 替换为OperationQueue.main,这是Swift更简洁的语法风格
  • 方法名优化:原方法startAccelerometerUpdatesToQueue(_:withHandler:) 调整为startAccelerometerUpdates(to:withHandler:),参数标签更贴合Swift的可读性要求

2. CGVector 重力设置代码转换

Swift 2 原代码

self?.physicsWorld.gravity = CGVectorMake(CGFloat((data?.acceleration.x)!), ((data?.acceleration.y)!))

Swift 4 推荐转换代码(安全版)

// 优先用可选绑定避免空值崩溃
if let accelerationData = data {
    self?.physicsWorld.gravity = CGVector(dx: CGFloat(accelerationData.acceleration.x), dy: CGFloat(accelerationData.acceleration.y))
}

备选简化写法(带默认值)

如果你想一行写完,也可以用空合运算符给空值设置默认值:

self?.physicsWorld.gravity = CGVector(dx: CGFloat(data?.acceleration.x ?? 0), dy: CGFloat(data?.acceleration.y ?? 0))

改动说明

  • 初始化器替换:CGVectorMake 在Swift 3+被弃用,改用CGVector(dx:dy:)的初始化方法,符合Swift的初始化语法规范
  • 移除强制解包:原代码中的!强制解包非常危险,一旦data为空就会崩溃,推荐用if let可选绑定或者??空合运算符做安全处理
  • 类型转换兼容:acceleration.x/y是Double类型,直接转CGFloat在Swift 4中是完全兼容的,语法无需额外调整

内容的提问来源于stack exchange,提问作者Niccolò Voltolini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:44:31