zoukankan      html  css  js  c++  java
  • 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:突然又想起来贼难用的快捷注释以及贼贼难看的字体。一星不谢。

    5.Type 'Any' has no subscript members

      这一条简直莫名其妙。大体意思就是,你这个类型"Any"不是个数组或者字典,不能按照下标取东西。

      我之前通过一个方法默认创建了一个字典,编译器也认为这是个字典,所以允许我取东西,但是现在编译器翻脸了,说你必须告诉我这是个字典我才能让你取东西。okok。

    1     (dic as! NSDictionary)

      同理还有各种类型不匹配的问题,强制转换就可以了。(偷偷说,真怀念OC的弱类型的时代~)

  • 相关阅读:
    Multisim的电路分析方法
    转载论文关于fir滤波器的fpga实现
    verilog数组定义及其初始化
    FIR滤波器的FPGA实现方法
    matlab的fda工具使用方法
    卷积的幽默解释
    lvds配置
    latch的产生和消除
    时序优化实例
    第九篇:使用 lstat 函数获取文件信息
  • 原文地址:https://www.cnblogs.com/SoulKai/p/6056659.html
Copyright © 2011-2022 走看看