我正在参与「启航计划」

前语

公司有个项目一直是用 OC 进行开发,现在想改成 Swift 来开发。那先说一下为什么有这样的主意,咱们都知道 Swift 代码更简略,易维护,安全并且快,网络上也是许多描绘,那咱们主要的是忧虑一旦变成混编工程,会不会出现许多问题,还有如何解决这些问题。功能问题方面Swift 和 OC 共用一套运行时环境,并且支撑 Swift 桥接 到 OC上,所以呢,问题不大。假如有不同的主意,也欢迎留心指教。

桥接文件

咱们只需在 OC 项目中,创建一个 swift 文件,体系就会弹出桥接文件,咱们点击 “Create Bridging Header”即可。

OC项目用Swift开发方便吗?

OC 工程接入 Swift

OC 类 引证 Swift 类

如上面咱们创建了一个 swift 文件,里边写一些办法提供给 OC 运用。

@objcMembers class SwiftText: NSObject {
    func sayhello() -> String{
        return "hello world"
    }
}
class SwiftText2: NSObject {
    @objc func sayhello() ->String{
        returnOCAPI.sayOC()
    }
}

这里咱们有关键字2个,1个是@objcMembers,表明所有办法属性都能够提供给 OC 运用。另外一个是@objc,表明修饰的办法属性才能够提供给OC运用。

那咱们 OC 类怎样用这个 swift 文件呢。 先在咱们该类添加头文件

#import "项目Target-Swift.h"

然后咱们点进去看下。

OC项目用Swift开发方便吗?

能够看到咱们写的 swift 文件类,办法,属性,都被转化为 OC 了,有了这个咱们直接运用即可。

OC类 运用 swift Pod库

说实话,这种用的比较少,但有时分咱们真的觉得 swift Pod库 会更好用,那咱们怎样去处理呢?

首先咱们要搞懂一点,有些是支撑运用的,如PromiseKit,有些是不支撑运用的如Kingfisher

先说第一种支撑运用的,咱们直接导入#import <PromiseKit/PromiseKit.h>即可。

那要是第二种的话,咱们还有一种办法,就是先用 swift 写一个该库管理类,然后里边引证咱们该库的内容,咱们通过 @objc 来提供给咱们 OC 运用。

Swift类 引证 OC 类

假如咱们编写的 Swift 类,想要用到 咱们 OC 的办法,那咱们如何处理呢?

咱们直接在桥接文件"Target-Bridging-Header.h"里边,直接导入头文件#import "XXX.h"即可运用。

Swift类 运用 OC pod库

其实这个更简略,和 Swift 工程引进 OC pod库相同,在该类里边导入头文件即可。

import MJRefresh

遇到问题

问题1:引进swift pod库 问题

假如咱们 OC 项目 是没有 运用use_frameworks!。那咱们导入swift Pod库 就会报错。

那咱们就在工程配置里边 Build Settings里边,搜索 Defines Module, 更改为 YES 即可。

OC项目用Swift开发方便吗?

问题2:OC 类承继问题

OC的类是不能承继至Swift的类,但Swift 类是能够承继 OC类的,其实方式也是"Target-Bridging-Header.h"导入头文件即可。

问题3:宏界说问题

咱们自己从头一份 本来的是

#define kScreenWidth        [UIScreen mainScreen].bounds.size.width                      
#define kScreenHeight       [UIScreen mainScreen].bounds.size.height

现在的是

let kScreenWidth = UIScreen.main.bounds.width
let kScreenHeight = UIScreen.main.bounds.height

有一些,咱们能够界说问办法来代替宏。

问题4:OC常常调用swift库导入问题

咱们知道xxx-Swift.h都是包含所有swift 提供给 OC 运用的类,所以咱们能够把xxx-Swift.h放到 pch 文件里边,就能够在任意一个 OC 工程文件直接调用 swift 类。

OC 在线转为 swift

提供一个链接,能够支撑 OC 转为 swift。 在线链接

最后

经过上面的总结,OC 项目 运用 swift 开发 的确是问题不大,运用过程中可能也会遇到编译问题,找不到文件问题,只需仔细排查,也是很简单解决,那等后续项目用上正轨,还会把遇到的坑填补上来,如有缺乏,欢迎指点。