Swift2.3适配Swift3.0时出现的各种问题

时间:2022-01-05 06:40:18

  昨晚上一波手贱把我的小5s升到iOS10。如此配套的话,Xcode7.3升级Xcode8.1看来也是势在必行了。公司程序是Swift2.3的,出于对苹果的恐惧迟迟不敢升级。但丑媳妇儿总要见公婆,借这个机会,也趁双休时间,做一下适配好了。

  首先,强调一点。做好备份!做好备份!做好备份!重要的事情说三遍。

1.关于使用的Swift代码库的问题

  这是我最心力交瘁的一个问题。

  项目中使用了Swift的几个开源框架,SwiftHTTP、SwiftyJSON、KingFisher等等。我的项目并没有使用CocoaPods,是直接将源码放到工程里面的。但很明显,这些三方框架也依然是Swift2.3时代的产物。首先,不管是用CocoaPods还是直接拷贝源文件的方式,请将你的三方框架升级到支持Swift3.0的版本(假如有的话),最好是最新版本。

  我是直接到GitHub上下载源文件,直接替换后,删掉原来导入的框架,然后重新导入框架的。

  接下来,打开工程,它会这样提示你:

Swift2.3适配Swift3.0时出现的各种问题

  点击Convert后:

Swift2.3适配Swift3.0时出现的各种问题

  第一次我,天真的以为我选择"Later"->"Later"我就什么都不用改就可以运行我的程序,或者说,点击Convert后选择Swift2.3可以实现直接跑程序。事实证明,仍然有两百个红色错误等着你去修改。我为什么不直接弄到Swift3.0呢?这样,我毅然决然删了第一份选择"Later"->"Later"和第二份选择"Convert"->"Swift2.3"的两份程序,开始实现Swift3.0之旅。

  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。

Swift2.3适配Swift3.0时出现的各种问题

  没错,你没有看错,就是这么任性。有人说选择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&period;0适配问题

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

  2. Swift2&period;3 --&gt&semi; Swift3&period;0 的变化

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

  3. Swift3&period;0语法变化

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

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

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

  5. Swift3&period;0变化分享

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

  6. swift3&period;0变化总结

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

  7. Swift3&period;0都有哪些变化

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

  8. UICollectionView在Swift3&period;0中的用法

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

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

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

随机推荐

  1. javascript 字符串相关知识汇总

    ① charAt(): 选中字符串内第几个元素 <script> var str="1234567389"; alert( str.charAt(1) ); // 2 ...

  2. android sqlite支持的数据类型

    Sqlite3支持的数据类型 :NULL.INTEGER.REAL.TEXT.BLOB 但实际上,sqlite3也接受如下的数据类型:    smallint 16 位元的整数.    interge ...

  3. Android(java)学习笔记80:UDP协议发送数据

    UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: 1 package cn.itcast_02; import java.io.IOException; import java.net. ...

  4. ExtJs5&lowbar;使用图标字体来美化按钮

    sencha 的例子中,有使用图标字体来美化按钮的例子,这个用起来又方便风格又统一,例如下图: 上面图标字体的使用方法也很简单,只要下载Font Awesome的css和图标文件,放到项目里就可以了. ...

  5. 【十分不错】【离线&plus;树状数组】【TOJ4105】【Lines Counting】

    On the number axis, there are N lines. The two endpoints L and R of each line are integer. Give you ...

  6. java基础之类与对象2

    这是上一篇文章的源码................ public class Main 是我创建的一个主类 我的基本操作就在这个类里面完成,public static void main(Strin ...

  7. java线程与进程

    Java线程与进程 进程与线程的关系 进程里面至少有一个线程,进程间的切换会有较大的开销 线程必须依附在进程上,同一进程共享代码和数据空间 多线程的优势 多线程可以达到高效并充分利用cpu 线程使用的 ...

  8. Perl解除引用:从引用还原到数据对象

    使用引用可以指向数据对象,这似乎很简单. @name1=qw(longshuai wugui); @name2=qw(xiaofang tuner); $ref_name=\@name1; push ...

  9. Android adt-bundle 开发环境的搭建&lowbar;windows

    本文完全拷贝的是:  https://www.jb51.net/article/87953.htm  的文章仅仅用于自己保存学习消息. Android开发环境有三种方式,分别是JDK+SDK+Ecli ...

  10. 必修3第三章概率mindmaps

    % !Mode:: "TeX:UTF-8" \documentclass{article} \usepackage[screen]{geometry} \usepackage[no ...