如何在swift中调用输入/输出为void*的C函数
前言
开发过程中难免遇到各种各样的需求,有的需求则需要调用某些硬件公司开发的SDK,然而这些SDK往往比较底层,接口大部分是使用C语言写的,然而众所周知OC调用C语言API还是比较轻松的,然后swift调用C则比较麻烦了。本人是在接入某实时监控SDK时遇到的此类问题,需要传入一个UIView给C函数,在该UIView上面显示实时监控画面。
LONG __stdcall NET_DVR_RealPlay_V40(LONG lUserID, void* lpPreview, REALDATACALLBACK fRealDataCallBack_V30 = NULL, void* pUser = NULL);
由于本人解决该问题走了很多弯路,直接相关的文章又十分稀少,故写此文章进行分享。
实际问题与解决方案
问题:如何将swift中的UIView对象转化为void*类型作为参数调用C函数?
须知:swift要想调用C函数必须经由OC桥接完成。
解决方案一:在swift中使用UnsafeMutableRawPointer指针指向UIView对象,再通过OC桥接文件中声明该C函数,最后在swift中直接传入UnsafeMutableRawPointer类型参数进行调用。
原理:UnsafeMutableRawPointer:swift指针类型,相当于C中的void*。
解决方案二:创建一个相应的OC函数,参数类型改为id。在该OC函数中将id转为void*类型后,再在该OC函数中调用那个C函数。
原理:id:OC指针类型,相当于C中的void*,对应于swift中的Any?类型。
总结与demo
由于解决方案一中的swift指针使用起来比较复杂而且危险,不太推荐像我这样的萌新使用。Apple将它命名为Unsafe也是警告你使用它必须足够自信。但也希望有好学的童鞋能写一个解决方案一的demo一起分享使用~
推荐使用解决方案二,另附上一个简单的demo帮助大家理解和使用。
本人QQ:1219953432 欢迎拍砖指正~