微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift与Objective-C互相调用(总结)

公司正式使用swift语言开发项目已经一年多, 现在总结一下swift和OC互相调用的经验


98aaf7887e8481043282c49907fb21cc.png


swift调用OC

1. 创建 "工程名称"-Bridging-Header.h文件

创建桥接文件

  • 如果新建工程没有勾选创建-Bridging - Header.h文件, 则需要手动创建一个"工程名称"-Bridging-Header.h文件,
    创建一个Header File文件,一般命名为“项目名-Bridging-header”内容清空

    aa20e4704702325542ed81c02e199d2b.webp


  • 然后在工程中设置:TARGET -> Build Settings -> Objective-C Bridging Header 填充好你的文件名称"工程名称"-Bridging-Header.h

    4f67b74a8b913c6838f4f99c17acda86.webp


  • 找到工程文件下的TARGETS --> Build settings搜索 Defines Module设置为YES

    0722ffefc12d08247d858c6c7450ce1e.webp


2. 引入OC的.h头文件 就能在swift项目中调用相对于的OC类了.

38e11a2044fff164193a4d54224453f5.webp


oc调用swift

1. 工程配置

找到工程文件下的TARGETS -->Build settings搜索 Product Module Name设置为工程名,这时工程会自动创建一个"项目名"-Swift.h文件,该项目中为“SwiftTestProject-Swift.h”,这个文件用于oc调用swift文件, 认不展示的.

ddcda28f86a68e104e718a3c6ad283f3.webp


2. 引入 "项目名"-Swift.h文件

在OC文件里面里面#import "项目名称-Swift.h", 注意这个文件没有提示,要手动打出来,然后就能在OC类里面使用swift的类了.

注意和总结

特别注意 OC调用Swift中的Class类

  1. 这个类必须是继承NSObjec或者NSObjec的子类
  2. Class前面要加@objcmembers (这个关键字是让该类所有属性方法加上@objc),3.0之前是苹果自动帮你加上的,据说嫌弃打包会偏大一些,后面改成自己手动加。
    例如:
@objcmembers class CustomServicetool: NSObject {}
  1. 类中的协议、枚举、结构体这些东西的调用
  • 协议:直接在前面加一个@objc
@objc protocol CustomServicetoolDelegate: NSObjectProtocol {}
  • 枚举:必须定义出Int类型,前面加@objc才能调用(毕竟swift的枚举比OC强大太多)
@objc enum CPLineType: Int {case schoolToHome = 0case hometoSchoolcase return}
  • 结构体:在oc中是不能调用struct里面的内容的,你想在类似class前面加个@objc的方法加在struct前面是不行的,那但是我们又想在oc中调用struct的属性,那怎么办呢?我们只能再建一个类,在类里写个方法来返回struct中的值

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130 595 548,不管你是小白还是大牛都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

坑点:

  1. 每次在一个类前面加个@objcmembers的时候都需要重新编译一遍才能打出提示(混编期间,报错请不要怀疑自己的代码,大部分编译一下就没事了。。。)

  2. 有种特殊的情况,比如我一个OC控制器中调用了swift写的view,然后其他用swift写的控制器需要调用OC控制器,这时候要是只是把OC控制器写到桥接文件中是会报错的。(这种就是混编项目比较变态的情况)------------解决办法:swift写的View用向前声明( @class BannerView);

  3. swift中的一些类型是OC没有的,或者类型名字差不多但是类型完全不同
    例如:
    swift中的Int定义成可选类型的时候,这时候OC是调不了swift的Int类型,解决方式,定义普通Int型


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐