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
相关产品推荐
相关产品推荐

