OC项目用Swift开发方便吗?
我正在参加「掘金·启航计划」
前言
公司有个项目一直是用 OC 进行开发,现在想改成 Swift 来开发。那先说一下为什么有这样的想法,我们都知道 Swift 代码更简单,易维护,安全而且快,网络上也是很多描述,那我们主要的是担心一旦变成混编工程,会不会出现很多问题,还有如何解决这些问题。性能问题方面Swift 和 OC 共用一套运行时环境,而且支持 Swift 桥接 到 OC上,所以呢,问题不大。如果有不同的想法,也欢迎留意指教。
桥接文件
我们只要在 OC 项目中,创建一个 swift 文件,系统就会弹出桥接文件,我们点击 "Create Bridging Header"即可。
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"
``` 然后我们点进去看下。
可以看到我们写的 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 即可。
问题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 开发 的确是问题不大,使用过程中可能也会遇到编译问题,找不到文件问题,只要细心排查,也是很容易解决,那等后续项目用上正轨,还会把遇到的坑填补上来,如有不足,欢迎指点。
- 我 与 unity 之间有趣的事情
- iOS嵌入虚拟引擎unity3d
- OC项目用Swift开发方便吗?
- Block的原理分析
- iOS多线程之三:NSThread,NSOperation,GCD超详细总结
- UITableViewCell加载图片优化
- iOS底层之isa指针分析,calloc分析和内存对齐(2)
- 详细分析iOS启动页广告
- 六大设计原则:迪米特法则
- 六大设计原则:接口隔离原则
- 六大设计原则:依赖倒置原则
- 六大设计原则:里氏替换原则
- 六大设计原则:开闭原则
- 六大设计原则:单一职责原则
- 光速打脸,Guideline 5.1.2又中招
- framework not found "BDPCAID"
- Xcode13.0和iOS15.0适配
- swift Core Data 简单使用
- 聊一下Swift的访问权限
- Charles安装和配置HTTPS证书