OC与Swift的互相调用

2023-06-28  本文已影响0人  sunny635533

引用文章:https://zhuanlan.zhihu.com/p/368893976
参考文章:https://blog.51cto.com/u_12801393/2967495
感谢分享!!!本文是保存收藏而已!

swift调用OC

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

创建桥接文件

[图片上传失败...(image-751813-1688030732645)]

[图片上传失败...(image-1dd240-1688030732645)]

[图片上传失败...(image-de6f61-1688030732645)]

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

[图片上传失败...(image-f354f6-1688030732645)]

oc调用swift

1. 工程配置

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

[图片上传失败...(image-ba768c-1688030732645)]

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

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

注意和总结

[图片上传失败...(image-6772f0-1688030732645)]

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

  1. 这个类必须是继承NSObjec或者NSObjec的子类
  2. Class前面要加@objcMembers (这个关键字是让该类所有属性和方法加上@objc),3.0之前是苹果自动帮你加上的,据说嫌弃打包会偏大一些,后面改成自己手动加。
    例如:
@objcMembers class CustomServiceTool: NSObject {}
  1. 类中的协议、枚举、结构体这些东西的调用
@objc protocol CustomServiceToolDelegate: NSObjectProtocol {}
@objc enum CPLineType: Int {
case schoolToHome = 0
case homeToSchool
case return
}

坑点:

  1. 每次在一个类前面加个@objcMembers的时候都需要重新编译一遍才能打出提示(混编期间,报错请不要怀疑自己的代码,大部分编译一下就没事了。。。)
  2. 有种特殊的情况,比如我一个OC控制器中调用了swift写的view,然后其他用swift写的控制器需要调用OC控制器,这时候要是只是把OC控制器写到桥接文件中是会报错的。(这种就是混编项目比较变态的情况)------------解决办法:swift写的View用向前声明( @class BannerView);
  3. swift中的一些类型是OC没有的,或者类型名字差不多但是类型完全不同
    例如:
    swift中的Int定义成可选类型的时候,这时候OC是调不了swift的Int类型,解决方式,定义普通Int型
上一篇 下一篇

猜你喜欢

热点阅读