在swift2.3的时候,因为项目需求,需要做一个能够根据加速度来得到你行走的计步器,然后做完计步器,每走一步路后,通过跳转,跳到主线程进行画图画点。
然而最近一段时间,电脑更新到了Xcode8.0 ,一下子就能用swift3.0了,想到swift3.0官方说明是可以进行版本继承的,所以就将计步器改成3.0版本,但是遇到了以下的一些问题:
以下由这个几个错误组成:
错误一: (data[0] as AnyObject) .doubleValue
错误原因: '(AnyObject)' is not a subtype of 'NSNumber'
错误二:userInfo: nil
错误原因: Extra argument 'userInfo' in call
错误三: for i = 4 ; i < len-1 ; i += 1
错误原因:C-style for statement has been removed in Swift 3
错误四: aez = (Double)((userAccelerationx*orientationycos*orientationzsin)-(userAccelerationy*orientationysin)+(userAccelerationz*orientationycos*orientationzcos))
错误原因:: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions
第一个错误是在类型转换时遇到的错误,原来现在的版本数据类型可以直接将double放在最前面,然后要加上数据类型,应该改成以下几个版本:
(data[0]as!NSNumber) .doubleValue
Double(self.acclerometerdata[0]as!NSNumber)
Double((self.acclerometerdata[0]asAnyObject)as!NSNumber)
以上的三种写法都是正确的。
第二个错误是在写通知时遇到的错误:
原先的通知写法是:
NotificationCenter.defaultCenter.postNotificationName("Notificationaddstteps",object: self, userInfo: ["value3":5])
以上写法是swift2.3版本写法,swift3.0不支持,需要改成下面版本写法:
NotificationCenter.default.post(name: NSNotification.Name(rawValue:"Notificationaddstteps"), object:self, userInfo:["value3":5])
第三个错误是,因为版本改变出现了一些变化:
Swift 3.0更加规范化,当项目从Swift 2.0升级至Swift 3.0时,需要注意以下几点:
1、方法的参数标签不可省略,从第一个参数就必须指定参数名,除非使用"_"明确指出省略参数;
2、枚举值的首字母统一为小写;
3、Swift 3.0取消了C风格的for循环,for var i = 0 ;i < 10 ; i += 1语句变更为:for i in 0 ..< 10
4、枚举成员首字母变成小写;
5、按钮的Normal状态去掉,按钮状态UIControlState()相当于原来的.Normal;
6、取消++、--操作符;
7、方法名使用动词,其他名词、介词等作为参数或移除
所以需要使用for i in 0 ..< 10 这种方法了。
第四个错误是因为它现在似乎不支持超长数据的转换,我将它进行一个一个数据转换久可以成功运行了,及改成如下版本:
aez = (Double)(userAccelerationx*orientationycos*orientationzsin)-Double(userAccelerationy*orientationysin)+Double(userAccelerationz*orientationycos*orientationzcos)
就不会报错。
更加具体的swift3.0 可以看官方文档:
现在版本Xcode8.0和 iOS10可以看看下面大家整理的资料:
cc网总结帖:
iOS10整理资料: