Swift 3.0项目迁移的一些记录

刚执行完Convert后报错600+,真是令人奔溃。
之后重新编译,仔细分析后发现其实真实错误远没有那么多。最终实际修改到的错误也就几十个,而且其中某些还是同一种错误。

这个项目是一个供自己使用的浏览器项目,因为app store上的浏览器都不支持自动锁定横屏,所以自己做了一个简单的浏览器(支持自动锁定横屏/竖屏)供自己使用。

主要一些修改:

  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.

    [解决方案] 设置 Build Settings —-> Use Legacy Swift Language Version —-> YES/NO,改为YES。

  2. 这个项目里使用了coreData,而对coreData的操作则是通过一个第三方库SuperRecord,这个框架作者没有更新,所幸代码量不多,只有6,7个文件。所以我选择了自己完成代码的迁移,而没有去更换框架。

    这个框架的报错,主要集中在泛型的使用上:

    在swift 3.0中,扩展方法不容许使用原泛型定义中的类型参数

    解决办法:以一个代理类来代替原来的对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)

转载于:https://www.cnblogs.com/wj033/p/6284813.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值