OC项目用Swift开发方便吗?

语言: CN / TW / HK

我正在参加「掘金·启航计划」

前言

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

桥接文件

我们只要在 OC 项目中,创建一个 swift 文件,系统就会弹出桥接文件,我们点击 "Create Bridging Header"即可。

image.png

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"

``` 然后我们点进去看下。

screenshot-20221012-161944.png

可以看到我们写的 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 即可。

screenshot-20221012-165202.png

问题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 开发 的确是问题不大,使用过程中可能也会遇到编译问题,找不到文件问题,只要细心排查,也是很容易解决,那等后续项目用上正轨,还会把遇到的坑填补上来,如有不足,欢迎指点。