OC调用Swift4.0的各种坑【转】

原文地址

简述:最近几年苹果主推swift,OC已经很少更新了,处于维护状态。所以慢慢多了很多OC混编Swift的项目,但是其实swift调用OC还是挺简单的,把OC项目慢慢转成swift问题不大。swift可以算是OC更上层的语言,我这里说的坑都是关于Swift转OC的,很奇葩吧,还有把Swift项目转成OC的,一句话公司需求,怼得程序员无言以对。(废话不多说了,后面全是骂项目经理和产品的。。。省略一万字)

OC和Swift混编的基础设置就不说了,可以看我之前的一个文章
https://www.jianshu.com/p/69ba19692bae

一. OC调用Swift中的Class类这里

1.这个类必须是继承NSObjec或者NSObjec的子类

2.Class前面要加@objcMembers (这个关键字是让该类所有属性和方法加上@objc),3.0之前是苹果自动帮你加上的,据说嫌弃打包会偏大一些,后面改成玩家自己加。
例如:@objcMembers class CustomServiceTool: NSObject {}

3.类中的协议、枚举、结构体这些东西的调用
① 协议:直接在前面加一个@objc
@objc protocol CustomServiceToolDelegate: NSObjectProtocol {}

②枚举:试了一下,必须定义出Int类型,前面加@objc才能调用(毕竟swift的枚举比OC强大太多)
@objc enum CPLineType: Int {
case schoolToHome = 0
case homeToSchool
case return
}

③结构体:在oc中是不能调用struct里面的内容的,你想在类似class前面加个@objc的方法加在struct前面是不行的,那但是我们又想在oc中调用struct的属性,那怎么办呢?我们只能够再建一个类,在类里写个方法来返回struct中的值

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

扫描二维码关注公众号,回复: 3654603 查看本文章

猜你喜欢

转载自blog.csdn.net/u012338816/article/details/83176751