美文网首页
Swift2.3迁移到Swift3.0

Swift2.3迁移到Swift3.0

作者: 南国青天 | 来源:发表于2017-02-22 16:30 被阅读152次

    迁移并使用动态库

    一个Swift2.3项目迁移到Swift3.0, 并且使用use_framworks!全部第三方库升级到动态库.

    一共花费了将近2个星期解决遇到的问题, 非常多的坑!

    公司有十几个的公共库被导入, 而这些库的#importpodspec.json使用不规范,导致迁移动态库遇到很多问题.

    #import

    动态库: 引用并其他库的头文件时, 必须使用 #import<SDWebImage/UIImageView+WebCache.h>, 而不能使用 #import"UIImageView+WebCache.h"
    静态库: 静态库使用2种均不会报错, 而动态库必须使用第一种.

    podspec.json

    podspec.json: 由podspec ruby生成json文件, CocoaPods根据这个文件,管理和配置第三方库的代码和依赖.

    动态库: 你的库依赖什么第三方库, podspec中dependencies字段, 必须的填写你所依赖库的名字, 否则编译会报错xxx file not found,

    静态库: 即使你不写依赖, 编译仍然可以找到文件

    Redundant confromance of 'xxx' to protocol 'xxx'

    当使用一个OC的动态库时候, 无论你是在Bridge.h 使用 @import XXKit; 还是在.swift文件里使用 import XXKit. OC库里面的Category将会作用全局.

    BlocksKit里有很多Category, 并且在.h公开了一些协议.

    //UIActionSheet+BlocksKit.h
    @interface UIActionSheet (BlocksKit) <UIActionSheetDelegate>
    
    ///-----------------------------------
    /// @name Creating action sheets
    ///-----------------------------------
    
    @end
    

    那么你只要导入了他的框架, 那么他会默认给所有继承UIActionSheet的子类统统添加上UIActionSheetDelegate协议.

    最好的办法就是将协议放在 .m文件, 然后作为私有协议使用.
    如果这要公开出来, 那么也不要使用系统的协议, 你可以自己声明一些自己写的协议, 否则Swift在动态库使用的时候, 会默认給所有的class添加这个协议.
    按规范写呀!

    QQ20170222-165536@2x.png

    swift error in module info from this module will be unavailable in the debugger

    当我整理完全部项目的时候, 调试窗口的变量统统不可以视。
    网上说是Bridge.h文件导入库用了import<>,应该全部换成import""或者@import。

    QQ20170222-163453@2x.png
    但是我尝试之后都不能解决问题, 于是版本回滚到早前的版本查找问题.
    后来在AppDelegate 注释了一个我公司的一个库, 然后在Bridge.h文件@import AuditManageKit;, 然后就可以正常调试了. 这有可能是Xcode编译器的Bug也可以是代码不规范导致的.

    原因我猜测:
    其它同事写的OC文件, 被他导入到 Bridge.h文件内, 成为了全局导入的文件, 那么在import kit可能会造成重复引用. 但Swift Compiled 居然不报错, 这简直坑死人了, 折腾一天才解决这个问题.

    重要的事情再说一次, 写代码一定要规范.

    QQ20170222-163654@2x.png

    相关文章

      网友评论

          本文标题:Swift2.3迁移到Swift3.0

          本文链接:https://www.haomeiwen.com/subject/fljmwttx.html