美文网首页SwiftiOS假装进步
OC调用Swift4.0的各种坑

OC调用Swift4.0的各种坑

作者: iOS_小胜 | 来源:发表于2018-04-08 11:32 被阅读3027次

    简述:最近几年苹果主推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型

    相关文章

      网友评论

        本文标题:OC调用Swift4.0的各种坑

        本文链接:https://www.haomeiwen.com/subject/dijphftx.html