OC和swift混编Framework
1. 创建framework
首先我创建一个project,然后选择framework,选择OC语言,如下图:

然后再创建一个swift的class文件,最终目录结构如下:

framework中混编没有桥接文件,创建framework时,会自动生成一个xxx.h文件(如上:SwiftOCFramework.h),这个文件的作用和项目中混编的桥接文件作用类似
Build Setting ----> Build Active Architecture Only 需要设置为NO,表示编译出来的静态库支持所有的设备,如果为YES,则只支持当前编译设备最终选择真机和模拟器编译 即可得到framework,可以点击Products下framework,如果是没有编译的则是红色,编译过,则可以右击,寻找到framework的位置
2. OC和swift的互想调用
2.1 swift调用OC
- 首先我们在swift文件中增加方法来调用OC类中的方法
//该方法内部直接调用OC中的方法
public func swiftToOC() {
print("-------------")
let OCtest = TestOCFile()
OCtest.ocTest()
TestOCFile.swiftTest()
}
- 注意:
- swift中的方法,如果是有关键字
public修饰,则可以在framework外面访问,如果没有用此关键字修饰的,则无法调用 - swift文件中调用OC的类,跟其项目中混编类似,需要再头文件(xxx.h)中导入需要调用OC的.文件
- xxx.h头文件想要导入OC的.h文件,首先xxx.h文件必须在public中,并且OC的这个.h文件也必须处于public,不然报错找不到该文件
- Build Phases —> Header , 如果该头文件不在public中,需要把头文件放到public中,直接拖拽即可:

- swift中的方法,如果是有关键字
2.2 OC中调用swift文件
- (void)ocToswift {
TestSwift *test = [[TestSwift alloc] init];
[test OCCallBackSwift];
}
public class TestSwift: NSObject {
@objc public func OCCallBackSwift() {
print("OCCallBackSwift")
}
}
- 注意:
- OC调用swift,需要导入swift的头文件,例如:
#import <SwiftOCFramework/SwiftOCFramework-Swift.h> - swift的class 必须要被
public关键字修饰 - swift中的method必须要被
@objc和public两个关键字更新,@objc:给OC调用的方法必须加上次关键字,public是表示公开暴露的方法
- OC调用swift,需要导入swift的头文件,例如:
2.3 合并framework
选择真机和模拟器编译之后,我们右击找到framework的所在地:

首先我们可以通过终端输入指令:
lipo -info framework的地址来查看两个framework支持的架构信息:
同样的我们通过此方式查看真机的架构:
合并两个真机库和模拟器库,我这里直接把模拟器的framework合并到真机里面,合并之后查看合并的framework的架构信息,使用命令
lipo -create 真机framework地址 模拟器framework地址 -output 输出文件路径:
合并完库之后发现只能在真机上运行,无法在模拟器上运行,这是因为我们只是合并了库,但是没有合并SwiftOCFramework.swiftmodule里面的文件,现在只需要把模拟器中的文件直接拷贝到你合并的framework的对应文件中,然后再导入framework运行即可合并完库之后,直接把framework拖入到项目中,导入头文件,既可以直接使用了。