直接上主题,想要到达这么一个效果:写一个动态库,里边一起存在给外部调用的swift跟oc文件,也有只供内部调用的oc文件(外部无法调用),那么就需求完成一个混编framework了。

以下是混编留意的地方:

1、给外部调用的oc头文件需求移动到public这一栏,一起加入到Compile Source,并且在项目名.h文件中运用#import <项目名/xxx.h>的形式导入。

2、在framework内是无法运用bridging-header文件的,因而想要完成swift调用oc,那么就需求用到module.modulemap文件与umbrella header了。新建一个.h文件,以#import “xxx.h”的方式导入一切oc头文件(包括提供给外部调用的)。

module.moduleMap格式网上有说,这儿直接贴代码:

//留意module名不能与项目名重复
module SwiftAndOCLibraryPrivate {
  umbrella header "SwiftAndOCLibraryPrivate.h" - 这儿填新建的.h文件
  export *
}

umbrella header的效果个人了解是以循环的形式把SwiftAndOCLibraryPrivate.h里边导入的一切头文件导出到当时模块。如果是单个oc头文件,可以用header,如果是多个oc头文件,只能用umbrella header导出。 之后在swift文件import SwiftAndOCLibraryPrivate就可以调用oc了。

3、oc想要调用swift,swift类必须用@objc + public修饰,不然无法访问。一起必须在oc文件#import <项目名/项目名-Swift.h>文件,这个文件是编译器自动生成的。笔者在这儿用了取巧的办法,从工程的编译输出framework目录里复制了一份到当时源代码目录下。之前尝试用脚本的办法复制-Swift.h文件到源码目录下,可是失利了。如果有更好的办法欢迎共享。

脚本代码如下

include_dir=${TARGET_BUILD_DIR}/include/${PRODUCT_MODULE_NAME}/
header_dir=${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}
# Ensure the target include path exists
mkdir -p ${include_dir}
# Copy any file that looks like a Swift generated header to the include path
cp ${header_dir}/*-Swift.h ${include_dir}

最后的工程效果图:

OC与Swift完成framework内混编

OC与Swift完成framework内混编

OC与Swift完成framework内混编

代码地址: gitee.com/dhjie/ocand…