我正在参与「启航计划」
前语
公司有个项目一直是用 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 开发 的确是问题不大,运用过程中可能也会遇到编译问题,找不到文件问题,只需仔细排查,也是很简单解决,那等后续项目用上正轨,还会把遇到的坑填补上来,如有缺乏,欢迎指点。