Swift2.3适配Swift3.0时出现的各种问题
昨晚上一波手贱把我的小5s升到iOS10。如此配套的话,Xcode7.3升级Xcode8.1看来也是势在必行了。公司程序是Swift2.3的,出于对苹果的恐惧迟迟不敢升级。但丑媳妇儿总要见公婆,借这个机会,也趁双休时间,做一下适配好了。
首先,强调一点。做好备份!做好备份!做好备份!重要的事情说三遍。
1.关于使用的Swift代码库的问题
这是我最心力交瘁的一个问题。
项目中使用了Swift的几个开源框架,SwiftHTTP、SwiftyJSON、KingFisher等等。我的项目并没有使用CocoaPods,是直接将源码放到工程里面的。但很明显,这些三方框架也依然是Swift2.3时代的产物。首先,不管是用CocoaPods还是直接拷贝源文件的方式,请将你的三方框架升级到支持Swift3.0的版本(假如有的话),最好是最新版本。
我是直接到GitHub上下载源文件,直接替换后,删掉原来导入的框架,然后重新导入框架的。
接下来,打开工程,它会这样提示你:
点击Convert后:
第一次我,天真的以为我选择"Later"->"Later"我就什么都不用改就可以运行我的程序,或者说,点击Convert后选择Swift2.3可以实现直接跑程序。事实证明,仍然有两百个红色错误等着你去修改。我为什么不直接弄到Swift3.0呢?这样,我毅然决然删了第一份选择"Later"->"Later"和第二份选择"Convert"->"Swift2.3"的两份程序,开始实现Swift3.0之旅。
假如之前更新你的三方框架的过程一切顺利的话,这里应该只有你的源程序,也就是XXX.app需要选择;如果非常不巧你的支持库里面并不支持Swift3.0,苦逼吧那就,不但需要在这里也选上,而且也需要在接下来三方框架的各种报错中苦苦挣扎。我相信你们的实力,恩。
接下来是漫长的等待。
等待过后,只有一个蓝色的Save可选。我不多说,自己理解
以上这几条步骤,足足花了我一个半小时,但这只是万里长征的第一步。
接下来,你可能遇到这样的问题:
[报错信息] “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,改为NO或者YES。
没错,你没有看错,就是这么任性。有人说选择YES,有人说选择NO;依我的作法看,每一个都试试才是王道。。
其他的许多问题,通常在你更新框架后即可解决。不再赘述。
另外再说一句,红圈的警告,回车即好,接下来重点解决出现的各种红感叹号警告。
2.Value of type 'UIImageView' has no member 'kf_setImageWithURL'
报错代码:
1 repairImageView.kf_setImageWithURL(URL.init(string: self.repairDetail!.img!)!, placeholderImage: UIImage.init(named: "tp"), optionsInfo: nil, progressBlock: nil, completionHandler: { (image, error, cacheType, imageURL) in self.image = image
})
很明显是KingFisher的三方库中出现的问题。UIImageView类型没有"kf_setImageWithURL"这个成员,也就是属性与方法。那就是这个方法替换掉了。我们找一下其他的方式。
最终解决方案:使用这个方法解决:
repairImageView.kf.setImage(with: URL.init(string: self.repairDetail!.img!)!, placeholder: UIImage.init(named: "tp"), options: nil, progressBlock: nil, completionHandler: { (image, error, cacheType, imageURL) in self.image = image
})
猛然发现自己说了太多废话。其实就是替换掉了这些内容: kf_setImageWithURL( -> kf.setImage(with:
就这样子。方法名换了。
3.“ambiguous referenc to member datask(with: completionhandler:)”
报错代码:
let task: URLSessionDataTask = session.dataTask(with: request) { (data, resp, err) in }
莫名其妙就报错了。其实解决方案很简单,是因为:
let request = NSMutableURLRequest(url:myUrl!);
即:request是NSMutableURLRequest类型的,但是参数要求为URLRequest类型。所以代码改成这样即可:
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) in
request as URLRequest 强制转换类型。
4.Argument labels '(_:)' do not match any available overloads
报错代码:
let common = Mapper<Common>().map(ts)!
其中:Common是遵守了Mappable的模型类,ts是个字符串。这很明显是在使用ObjectMapper时,方法名替换了。
解决方案:
let common = Mapper<Common>().map(JSONString: ts)
ps:之前Swift的方法在使用中第一个参数的形参被省略,我是很看不惯这一点。不过貌似苹果又给改回来了,五星好评!
pps:突然又想起来贼难用的快捷注释以及贼贼难看的字体。一星不谢。
5.Type 'Any' has no subscript members
这一条简直莫名其妙。大体意思就是,你这个类型"Any"不是个数组或者字典,不能按照下标取东西。
我之前通过一个方法默认创建了一个字典,编译器也认为这是个字典,所以允许我取东西,但是现在编译器翻脸了,说你必须告诉我这是个字典我才能让你取东西。okok。
1 (dic as! NSDictionary)
同理还有各种类型不匹配的问题,强制转换就可以了。(偷偷说,真怀念OC的弱类型的时代~)
Swift2.3适配Swift3.0时出现的各种问题的更多相关文章
- Xcode8中Swift3.0适配问题
写在前面 收到一些小伙伴的来信,觉得可能下边没有表达清楚,先把大家关心的要点在此进行总结,有兴趣的可以看看下边的研究过程,没兴趣的直接看这段即可. Xcode8支持Swift2.3和Swift3.0两 ...
- Swift2.3 --> Swift3.0 的变化
Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...
- Swift3.0语法变化
写在前面 首先和大家分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcod ...
- Swift3.0 iOS获取当前时间 - 年月日时分秒星期
Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...
- Swift3.0变化分享
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
- swift3.0变化总结
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
- Swift3.0都有哪些变化
从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...
- UICollectionView在Swift3.0中的用法
UICollectionView在Swift3.0中的用法 UICollectionView的初始化跟OC中是相似的,创建 GameView 集成自 UICollectionView .注意不同于UI ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
随机推荐
- 解密:LL与LR解析 1(译)
解密:LL与LR解析 1 作者:Josh Haberman 翻译:杨贵福 由于GFW,我无法联系到作者,所以没有授权,瞎翻译的.原文在这里[http://blog.reverberate.org/20 ...
- Jenkins安装plugin
Jenkins支持很多的plugin,这些plugin极大地丰富了Jenkins的功能.安装plugin有两种方式:自动安装和手动安装. 1.自动安装 这种方式非常简单,但前提是Jenkins必须连接 ...
- java基础知识拾遗(二)
1.finally public static int func (){ try{ return 1; }catch (Exception e){ return 2; }finally { retur ...
- easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大 >>>>>>>>>>> ...
- MySQL闪回原理与实战
本文将介绍闪回原理,给出笔者的实战经验,并对现存的闪回工具作比较. DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除 ...
- SQL Server存储过程同时返回分页结果集和总数
前言 好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现.按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件 ...
- html的map自适应
Map常识 请自己看吧:http://www.w3school.com.cn/tags/tag_map.asp Map自适应 <!DOCTYPE html> <html> &l ...
- <video>和<audio>标签,对视频和音频的支持
H5新增了<video>和<audio>标签,提供对视频和音频的支持 <audio>的属性与<video>属性相同 <video> vide ...
- digitalocean Vultr Linode 三家海外vps最新真实情况
中国有大批用户,在使用海外vps服务器.好处是不言而喻的:性价比高.带宽大.免备案.可搭梯子,没有后门监控. 有趣的是,每一年的周期观察,都能发现海外vps对中国大陆的线路速度.可用性变化.过去速度快 ...
- linux 下查看cpu是几核的
几个cpu more /proc/cpuinfo |grep "physical id"|uniq|wc -l 每个cpu是几核(假设cpu配置相同) more /proc/cpu ...