静态库制作-混编(工程是oc为基础)

Posted chendingxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态库制作-混编(工程是oc为基础)相关的知识,希望对你有一定的参考价值。

最近工作需要,需要制作一些静态库。由于缺乏经验,特意找了一些资料,加上自己的测试。特意在此记录一些心得和踩过的坑。所谓“好记性不如烂笔头”,希望自己以后忘记的时候能回头来看看,同时也希望对后来者能提供一定的帮助。

这里,我只写对我来说是难点的地方。

首先,framework是静态库。是用oc编写的。如果静态库制作好了,没问题的话,无论是放到oc项目还是swift项目,都不应该有问题。其中,swift与oc互调也不会有问题。难点在于,在编写framework的时候,如果framework本身是混编的话,如果让swift与oc能相互调用。这可能需要花点时间来了解与测试一下。

一:swift 调用 oc

    1:可以在unbrella文件中#iimport你的oc头文件。然后在swift中可以直接调用oc代码。因为framework不能直接写桥接文件。所以建立桥接文件是徒劳无用的。(unbrella文件就是建立framework时系统帮你自动建立的一个头文件。)

   2:可以借助modulemap文件。modulemap可以使文件模块化。关于modulemap的使用,可以自行百度。个人觉得使用modulemap使用范围较广,即可以在framework中使用,也可以在app工程中使用,还能取代桥接文件的作用。是个非常好用的功能。(注意:在使用时,在buildsetting中需要import Path)

技术图片

技术图片

二:oc调用swift

  这个坑我踩了好久。注意点如下。

  1:在app中oc调用swift都会#improt "工程名-Swift.h".后面可以直接调用swift代码。在framework中,如果想调用swift代码,需要#import <工程名/工程名-Swift.h>,如图

#import <DD/DD-Swift.h>

 2:#import之后,build一下,发现是成功的。但是当调用swift类时,发现要么找不到属性,要么找不到方法。为什么呢。我们可以点击上面我们#import的头文件。这个文件就是系统自动把swift的类转为oc类,然后供我们调用的。发现系统只转换了一个init方法,其它属性和方法都看不到。这就是为什么我们无法调用属性和方法的原因。如何修改呢。首先,swift的类需要继承NSObject,要不然,系统连init方法都不给你转。第二,你需要调用的方法和属性需要使用@objc修饰。如下图

技术图片

技术图片

到此为止,framework中swift与oc互调的问题就写完了。后续如果还会有其它方面的问题,到时候再更新。

以上是关于静态库制作-混编(工程是oc为基础)的主要内容,如果未能解决你的问题,请参考以下文章

Flutter iOS OC 混编 Swift 遭遇动态库和静态库问题填坑

iOS - 静态类库 打包 C,C++文件及和OC混编

如何理解CMake文档,优先静态库,Cuda混编

iOS开发,如何打包静态库.a文件

ios OC、swift混编制作framework

iOS XCode7制作.Framework动态库和.a静态库的总结