昨晚上一波手贱把我的小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时出现的各种问题的更多相关文章

  1. Xcode8中Swift3.0适配问题

    写在前面 收到一些小伙伴的来信,觉得可能下边没有表达清楚,先把大家关心的要点在此进行总结,有兴趣的可以看看下边的研究过程,没兴趣的直接看这段即可. Xcode8支持Swift2.3和Swift3.0两 ...

  2. Swift2.3 --> Swift3.0 的变化

    Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...

  3. Swift3.0语法变化

    写在前面 首先和大家分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcod ...

  4. Swift3.0 iOS获取当前时间 - 年月日时分秒星期

    Swift3.0 iOS获取当前时间 - 年月日时分秒星期func getTimes() -> [Int] { var timers: [Int] = [] // 返回的数组 let calen ...

  5. Swift3.0变化分享

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  6. swift3.0变化总结

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  7. Swift3.0都有哪些变化

    从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...

  8. UICollectionView在Swift3.0中的用法

    UICollectionView在Swift3.0中的用法 UICollectionView的初始化跟OC中是相似的,创建 GameView 集成自 UICollectionView .注意不同于UI ...

  9. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

随机推荐

  1. python JSON API duckduckgo search engine 使用duckduckgo API 尝试搜索引擎

    The duckduckgo.com's search engine is very neat to use. Acutally it has many things to do with other ...

  2. 设置session超时

    在web应用中,设置session超时有三种方法: 1.在web.xml文件中配置:单位是分钟,范围是针对本项目所有用户的session <session-config> <sess ...

  3. shell脚本兼容linux/unix与windows/cygwin的基础(注意处理好CR, LF, CR/LF 回车 换行的问题)

    shell脚本兼容linux/unix与windows/cygwin的基础 :统一文本格式为:unix文本格式,即于LF为换行符(推荐方案) 在notepad上设置:编辑->档案格式转换-> ...

  4. C++中#和##的特殊使用

    1.用#号将输入的内容转换为字符串. 用##号将两个参数合并. #include <iostream> using namespace std; //将输入的内容转换成字符串 #defin ...

  5. C语言之冒泡排序

    冒泡排序: 1). 简介 其实就是把一个数组的元素,按照从小到大(从大到小)得顺序,重新排列起来,这种排序就叫冒泡排序 例: int nums[5] = {5,4,3,2,1}; //经过排序后 下标 ...

  6. Java 集合:HashSet 与 ArrayList

    Set 集合是无序不可以重复的的.List 集合是有序可以重复的. Java 集合:HashSet 与 hashCode.equals 博客里面已经说到这个问题,但是解释的还是不够清楚. 看一个小例子 ...

  7. Normalize.css 样式作用,及使用方法

    Normalize.css 是? Normalize.css 是一个可以定制的CSS文件,它让不同的浏览器在渲染网页元素的时候形式更统一. Normalize.css 能干什么? 保留有用的默认值,不 ...

  8. VC 2008 Express下安装OpenCV2.3.1

    VC 2008 Express下安装OpenCV2.3.1   注意: 下列文档以VC2008 Express为例,VC2010下的配置应与本文档类似. VC 6.0不被OpenCV 2.3.1支持. ...

  9. CentOS 7安装SVN以及高版本SVN

    安装 CentOS 7 下yum命令即可方便的完成安装 $ sudo yum install subversion 测试安装是否成功: $ svnserve --version 建立版本库 创建svn ...

  10. Python学习笔记进阶篇——总览

    Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...