ios OC、swift混编制作framework

按照文档一步一步来

新建一个基于单页面工程,然后新建一个一个Target,选中Cocoa Touch Framework。然后,分别新建一个Swift文件和Objective C类,注意Target Member Ship选中Framework。类的内容如下:

OCSource.h

[图片上传失败...(image-8dab68-1634619754604)]

OCSource.m

[图片上传失败...(image-2c9071-1634619754604)]

Swift调用OC

新建SwiftSource.swift

[图片上传失败...(image-34eca8-1634619754604)]

然后,按照文档中,为了让Swift文件访问Objective C文件,我们应该在umbrella header,也就是MixFramework.h中,暴露所需要的header。

也就是,MixFramework.h,

[图片上传失败...(image-b166c3-1634619754604)]

然后,自信满满的点击build。

Boom~~~,编译不通过。

[图片上传失败...(image-6ca763-1634619754604)]

原因:OCSource.h默认编译的时候是Project权限. 为了在umbrella header中使用,要把这个文件的权限改成Public

按照图中的方式拖过去即可。

[图片上传失败...(image-f2d31d-1634619754604)]

嗯,现在build,可以看到build成功了。

OC调用Swift

在SwiftSource.swift中,增加一个类,

[图片上传失败...(image-98ce8c-1634619754604)]

然后,为了在OC中调用Swift的方法,我们需要导入头文件,这时候,OCSource.m文件内容如下

[图片上传失败...(image-f61fb3-1634619754604)]

然后,build,发现成功了,很开心。


外部调用

在ViewController.swift中,我们调用Framework中的内容。

[图片上传失败...(image-6be19c-1634619754604)]

然后运行,发现控制台打印出

[图片上传失败...(image-4b70-1634619754604)]

嗯,framework打包成功了。


问题

通常,我们希望暴露给外部的接口是纯Swift,而OC文件的具体接口应该隐藏,这就是我标题中的优雅两个字的含义。

如果你好奇,你会发现,在ViewController.swift中你可以这么调用

[图片上传失败...(image-fefccf-1634619754604)]

也就是说,OC的内容也暴露出来了,这破坏了Framework的封装特性。

通过查看MixFramework的编译结果,发现最后暴露出的接口是这样子的

[图片上传失败...(image-8b0488-1634619754604)]

这一行,把OC对应的实现暴露出来了

[图片上传失败...(image-9c74a7-1634619754604)]


优雅的解决方案

不再通过umbrella header的方式让framework中的Swift调用OC方法。而是通过modulemap。

新建一个module.modulemap文件,内容如下

[图片上传失败...(image-633a91-1634619754604)]

[图片上传失败...(image-d30f90-1634619754604)]

这里的#(SRCROOT)是XCode的宏,会自动替换成项目所在的根目录,这里输入的路径是module.modulemap文件所在的路径。

然后,删除MixFramework.h(umbrella header)中#import 的OC header。

把OCSource.h的权限改回默认的project。

[图片上传失败...(image-291cca-1634619754604)]

再编译,发现OC的类被隐藏了。

你可能感兴趣的:(ios OC、swift混编制作framework)