Framework中实现OC和Swift的混编方案
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>背景:</li><li>解决方案:</li><ul class="second_class_ul"><li>OC调用Swift:</li><li>Swift调用OC:</li></ul><li>坑:</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>背景:</h2><p>iOS工程中实现的OC和Swift混编的方案和实现步骤已经很多了,在此不做赘述,本篇文章需要描述的是实现在Framework下的混编。</p>
<div class="cros igoods"><div class="goodsin" data-img="https://img14.360buyimg.com/pop/jfs/t1942/14/906990354/336460/c0aa426b/563b8251N47962ec5.jpg" data-name="Robot Framework自动化测试修炼宝典(博文视点出品)" data-owner="京东自营" data-price="60" data-tgid="38" data-url="https://union-click.jd.com/jdc?e=&p=JF8BAMoJK1olXwUFVVtbDkgeBl8IG1IUXAEDVG4ZVxNJXF9RXh5UHw0cSgYYXBcIWDoXSQVJQwYCXV9cD0oXHDZNRwYlKXFRPAYuYU9yfSdUWAYcNWJENSUoaEcbM2gNHF4dXwMBZF5eDkwXAmoIK2sVXDZQOobrvpOysnPcsdTA1ZEyVW5dD00VA2sAH1kQXQALZF5VDHtUVypcWBhdbTYyV25tOEsnAF9WdVpGWgMLVF5fZhZFXyRDQFkVMwYAUldbD08XBl8KGloXXzYy"></div></div>
<p class="maodian"></p><h2>解决方案:</h2>
<p>必要的设置(Framework Target对应的BuildSetting):</p>
<blockquote><p>Defines Module - YES</p>
<p>Product Module Name - framework名称</p>
<p>Install Objective-C Compatibility Header - YES</p>
<p>Objective-C Generated Interface Header - framework名称-Swift</p></blockquote>
<p>Objective-C Bridging Header - framework名称/ProductModuleName-Bridging-Header.h(设置后编译会报错,后面会给出解决方案)</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202301/20230108084242026.jpg" /></p>
<p>桥接文件-Swift调用OC时可以在该文件中添加OC头文件</p>
<p class="maodian"></p><h3>OC调用Swift:</h3>
<p>Swift类使用@objcMembers进行修饰,继承自NSObject或其子类</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202301/20230108084242027.jpg" /></p>
<p>Swift类定义</p>
<div class="jb51code"><pre class="brush:bash;">#import "ProductName/ProductModuleName-Swift.h"</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202301/20230108084242028.jpg" /></p>
<p>一般默认为framework的名称</p>
<p class="maodian"></p><h3>Swift调用OC:</h3>
<p>在ProductModuleName-Bridging-Header.h文件中引入Swift需要调用的OC头文件</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202301/20230108084242029.jpg" /></p>
<p>在这个桥接文件里面引用你想暴露给Swift调用类的头文件</p>
<p>说明:这个桥接文件需要自己手动创建</p>
<p class="maodian"></p><h2>坑:</h2>
<p>在OC类中引用Swift编译之后的头文件,必须采用<code>"ProductName/ProductModuleName-Swift.h"</code>方式,使用<code>ProductModuleName-Swift.h</code>方式,会提示找不到该文件</p>
<p>如果未设置Objective-C Bridging Header,引用ProductName/ProductModuleName-Swift.h头文件之后依然无法在OC类中调用Swift类,因为设置Objective-C Bridging Header后,才会编译Swift类到ProductModuleName-Swift.h中</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202301/20230108084242030.jpg" /></p>
<p>设置Objective-C Bridging Header后Swift类被翻译成OC类,才可以被OC调用</p>
<p>设置Objective-C Bridging Header后编译报错<strong>using bridging headers with framework targets is unsupported</strong>,解决方案就是修改ProductModuleName.h这个文件名称为其他名称,比如:ProductModuleNameHeader.h</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202301/20230108084242031.jpg" /></p>
<p>这个文件改动之后可能会出现头文件引用导致的问题,需要自己动手解决</p>
<p>以上就是Framework中实现OC和Swift的混编方案的详细内容,更多关于Framework OC Swift混编的资料请关注琼殿技术社区其它相关文章!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>使用 Swift Package 插件生成代码的示例详解</li><li>Flutter iOS开发OC混编Swift动态库和静态库问题填坑</li><li>Swift Package 技巧及混编兼容问题详解</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]