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
2
3       self.image = image
4    })

  很明显是KingFisher的三方库中出现的问题。UIImageView类型没有"kf_setImageWithURL"这个成员,也就是属性与方法。那就是这个方法替换掉了。我们找一下其他的方式。

  最终解决方案:使用这个方法解决:

1     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
2
3         self.image = image
4     })

  猛然发现自己说了太多废话。其实就是替换掉了这些内容:    kf_setImageWithURL(  ->  kf.setImage(with:

  就这样子。方法名换了。

3.“ambiguous referenc to member datask(with: completionhandler:)”

  报错代码:

1     let task: URLSessionDataTask = session.dataTask(with: request) { (data, resp, err) in   }

  莫名其妙就报错了。其实解决方案很简单,是因为:

1 let request = NSMutableURLRequest(url:myUrl!);

  即:request是NSMutableURLRequest类型的,但是参数要求为URLRequest类型。所以代码改成这样即可:

1   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

  报错代码:

1     let common = Mapper<Common>().map(ts)!

  其中:Common是遵守了Mappable的模型类,ts是个字符串。这很明显是在使用ObjectMapper时,方法名替换了。

  解决方案:

1     let common = Mapper<Common>().map(JSONString: ts)

  ps:之前Swift的方法在使用中第一个参数的形参被省略,我是很看不惯这一点。不过貌似苹果又给改回来了,五星好评!

  pps:突然又想起来贼难用的快捷注释以及贼贼难看的字体。一星不谢。

时间: 2024-08-11 07:38:19

Swift2.3适配Swift3.0时出现的各种问题的相关文章

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

Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift2.3的代码转换为Swift3.0. 手动调出Xcode自动转换Swift2.3 到 Swift3.0 弹出语言版本选择界面,选择Covert to Swift3,Next:  进入选择模块界面: 选择模块界面 建议只选择自己创建的模块,第三方框架的模块最好不要使用Xco

swift3.0变化总结

Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不仅仅是我下面的这个列表,但是列表中的每一项都是对你的一个巨大的打击. 虽然Swift 3.0 仍处于开发阶段.Swift 3.0 会有很多很多的变化,其中一些可能会在细微之处.然而,我们希望这些变化是一次性的.为了使Swift可以在未来几年更好的发展,在以后的版本更新中改变应该的显著变小.一些Swi

Swift3.0变化分享

Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不仅仅是我下面的这个列表,但是列表中的每一项都是对你的一个巨大的打击. 虽然Swift 3.0 仍处于开发阶段.Swift 3.0 会有很多很多的变化,其中一些可能会在细微之处.然而,我们希望这些变化是一次性的.为了使Swift可以在未来几年更好的发展,在以后的版本更新中改变应该的显著变小.一些Swi

UICollectionView在Swift3.0中的用法

UICollectionView在Swift3.0中的用法 UICollectionView的初始化跟OC中是相似的,创建 GameView 集成自 UICollectionView .注意不同于UITableView的用法,他需要用 UICollectionViewFlowLayout 来指定一些需要设置的属性,或者可以通过遵守 UICollectionViewDelegateFlowLayout 这个代理来实现.下面我用设置属性的方式来实现的,比较方便. //布局 layout.scroll

iOS 日期处理 (Swift3.0 NSDate)

处理日期的常见情景 NSDate -> String & String -> NSDate 日期比较 日期计算(基于参考日期 +/- 一定时间) 计算日期间的差异 拆解NSDate对象(分解成year/month/day/hour/minute/second 等) NSDate相关类 NSDate DateFormatter DateComponents DateComponentFormatter Calendar Date structure: Swift3.0中引入了Date s

iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装.本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的说,用到了一些iOS9以后UICollectionView添加的一些新的特性.本篇博客所涉及的技术点主要有UICollectionView的Cell移动,手势识别,控件封装,闭包回调,面向接口编程,Swift中的泛型等等.这些技术点在之前的博客中也多次使用到,只不过本篇博客使用这些技术点来完成我们的具体需求. 一.实例运行效果 先入为主,

Swift3.0中关于日期类的使用指引

处理日期的常见情景 NSDate -> String & String -> NSDate 日期比较 日期计算(基于参考日期 +/- 一定时间) 计算日期间的差异 拆解NSDate对象(分解成year/month/day/hour/minute/second 等) NSDate相关类 NSDate DateFormatter DateComponents DateComponentFormatter Calendar Date structure: Swift3.0中引入了Date s

Swift3.0语言教程使用指针创建和初始化字符串

Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例外,开发者可以使用指针去创建和初始化字符串. (1)在NSString中init(bytes:length:encoding:)方法可以从给定字符串按照指定获取方向,得到指定个数的字符,然后使用这些字符创建和初始化字符串.其语法形式如下: convenience init?(bytes: Unsaf

swift3.0的改变

Swift在这2年的时间内,发展势头迅猛,在它开源后,更是如井喷一样,除了 iOS.mac 平台,还支持了 Linux. 而今年下半年, Swift 3.0 也会随之发布.https://github.com/apple/swift-evolution详细介绍了3.0的特性. 这个版本的主要目标增强语言的二进制接口和标准库的稳定性,作为这个过程的一部分,我们将改善swift语言以提供在体验和执行(feel and implementation)的整体的一致性,Swift 3.0将包含2个对2.X