Swift 3.0項目遷移的一些記錄

剛執行完Convert後報錯600+,真是使人奔潰。
以後從新編譯,仔細分析後發現其實真實錯誤遠沒有那麼多。最終實際修改到的錯誤也就幾十個,並且其中某些仍是同一種錯誤。swift

這個項目是一個供本身使用的瀏覽器項目,由於app store上的瀏覽器都不支持自動鎖定橫屏,因此本身作了一個簡單的瀏覽器(支持自動鎖定橫屏/豎屏)供本身使用。瀏覽器

主要一些修改:app

  1. 這個自動修復就行了框架

    [報錯信息] 「Use Legacy Swift Language Version」 (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.ui

    [解決方案] 設置 Build Settings —-> Use Legacy Swift Language Version —-> YES/NO,改成YES。代理

  2. 這個項目裏使用了coreData,而對coreData的操做則是經過一個第三方庫SuperRecord,這個框架做者沒有更新,所幸代碼量很少,只有6,7個文件。因此我選擇了本身完成代碼的遷移,而沒有去更換框架。code

    這個框架的報錯,主要集中在泛型的使用上:索引

    在swift 3.0中,擴展方法不允許使用原泛型定義中的類型參數ip

    解決辦法:以一個代理類來代替原來的對obj-c 泛型類的extension。字符串

    特別之處,swift 3中 泛型方法的調用不能直接傳入類型參數

    class A{
         func a<T>(x:String)->T{
         }
    
         func b<T>()->T{
             // 不能寫做 a<T>(""),而是經過參數列表或返回類型自動推斷
             //,因此沒法定義一個參數列表和返回值裏沒有使用到所有類型參數的泛型方法
             return a("")
         }
     }
  3. NSDictionary 的值讀取,要使用valueForKey方法,而再也不能使用索引
  4. 字面量須要加類型轉換
    var dic = [String:AnyObject]()
    // 必須明確 加上 as AnyObject
    dic["a"] = [1,2] as AnyObject
  5. for i in 1..<3 {} 絕對不能寫做 for(i in 1..<3){}

————

幾個框架使用報錯

二維碼掃描頁面、訊飛語音識別都是一打開相關頁面就崩潰,須要修改plist,添加相機和麥克風的使用權限

在info.plist —Source Code形式打開後添加, 或者info.plist 在Property List 的形式下,而後點擊添加,
輸入 Privacy 能夠迅速定位到這一權限系列,找到你須要的權限,修改後面的 value 就能夠了

<!-- 相冊 --> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>App須要您的贊成,才能訪問相冊</string> 
<!-- 相機 --> 
<key>NSCameraUsageDescription</key> 
<string>App須要您的贊成,才能訪問相機</string> 
<!-- 麥克風 --> 
<key>NSMicrophoneUsageDescription</key> 
<string>App須要您的贊成,才能訪問麥克風</string> 
<!-- 位置 --> 
<key>NSLocationUsageDescription</key> 
<string>App須要您的贊成,才能訪問位置</string> 
<!-- 在使用期間訪問位置 --> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string>App須要您的贊成,才能在使用期間訪問位置</string> 
<!-- 始終訪問位置 --> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>App須要您的贊成,才能始終訪問位置</string> 
<!-- 日曆 --> 
<key>NSCalendarsUsageDescription</key> 
<string>App須要您的贊成,才能訪問日曆</string> 
<!-- 提醒事項 --> 
<key>NSRemindersUsageDescription</key> 
<string>App須要您的贊成,才能訪問提醒事項</string> 
<!-- 運動與健身 --> 
<key>NSMotionUsageDescription</key> 
    <string>App須要您的贊成,才能訪問運動與健身</string> 
<!-- 健康更新 --> 
<key>NSHealthUpdateUsageDescription</key> 
<string>App須要您的贊成,才能訪問健康更新 </string> 
<!-- 健康分享 --> 
<key>NSHealthShareUsageDescription</key> 
<string>App須要您的贊成,才能訪問健康分享</string> 
<!-- 藍牙 --> 
<key>NSBluetoothPeripheralUsageDescription</key> 
<string>App須要您的贊成,才能訪問藍牙</string> 
<!-- 媒體資料庫 --> 
<key>NSAppleMusicUsageDescription</key> 
<string>App須要您的贊成,才能訪問媒體資料庫</string>
複製代碼
若是不起做用,能夠請求後臺權限,相似於這樣:

<key>UIBackgroundModes</key>
<array> 
<!-- 在這裏寫上你在後臺模式下要使用權限對應的key --> 
<string>location</string>
...
</array>

coredata 讀取數據報錯,則是由於表名和方法調用中傳人的表名字符串必須徹底一致,而我原來把首字母小寫了。之前沒問題,但如今
EntityDescription.entity會返還nil,致使數據讀取失敗。

let entity = NSEntityDescription.entity(forEntityName: "BookMark", in: appDelegate.managedObjectContext)
相關文章
相關標籤/搜索