在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 可以看官方文件:swift.org/blog/swift-…
現在版本Xcode8.0和 iOS10可以看看下面大家整理的資料:
cc網總結帖:[總結帖]關於升級xcode8
iOS10整理資料:ios.jobbole.com/89028/