iOS (OC与Swift)混编之各种填坑,(实战demo赠送)

iOS混编,大概意思是Objective-C(后面简称OC)工程里面会用到用Swift写的代码文件,或者是Swift工程里面用到用OC写的代码文件;大概分为以下几种情况

  • OC工程直接拖入使用.swift文件
  • OC工程pod 引入Swift第三方库文件
  • Swift工程里面直接拖入使用OC,.h/.m文件
  • Swfit工程里面pod 引入OC第三方库文件

OC工程直接拖入使用.swift文件

先给结论:

一 需要把swift文件里面的struct,改为类,并且继承自NSObject
二 在类文件中需要加@objc 或者@objcMembers
三 swift文件里面如果有枚举类型,能转为OC代码的前提是:

  • 1.加@objc,同上面;
  • 2.枚举的原始值类型是Int型,并且不能有相关值,因为OC里面的枚举只有Int类型,而且没有相关值的概念。
  • 3.swift里面枚举类型不能为可选型,因为OC里面的枚举不可以为空

第一步
在OC工程,当拖入第 一swift文件,或者新建第一个swift文件时,会弹出一个创建桥接头文件的窗口,这个需要选择“create Briging Header”,后面我们会用这个头文件

image.png

桥接文件的格式 “XXX-Bridging-Header.h”,其中“XXX”是工程的名称,如下图所示


image.png

第二步

image.png

如上图所示,先来看一下我们的swift文件,里面是一个结构体Person,在OC里面是没有结构体,只有类的概念,所以正常swift里面的结构体是不能自动转为OC里面的类的,所以应该不会有任何反应的

我们在ViewController里面导入#import "XXX-Swift.h",XXX同样是工程名称,如下图

image.png

编译,看一下,导入一个swift文件后,OC工程会不会报错,幸运的是不会编译报错。这个时候尝试敲一个Person这个类名,看编译器会不会给出提示

image.png

结果是没有任何提示,也就说明了结构体,是不能自动转化为OC相应代码

那我们能不能尝试加@objc,让其能转化呢? **(加@objc,是让swift代码能自动转化为OC代码的主要方法)**

image.png

如上图所示,直接提示,@objc,应该用在类身上。所以一个小小的结论:Swift里面的结构体是不能转为OC代码,也就不能在OC工程里面使用的

第三步
我们把Person 改为类的形式,如下所示,然后在ViewController里面看有没有提示

image.png

如上图,还是没有任何提示;
那我们再加@objc,而且根据提示,Person类要继承NSObject类,再来看看编译器会不会给我们提示
image.png

可以看出是可行的,Person类已经可以被编译器自动提示出来了。
这个时候那些没有加@objc的属性和方法还是不能用的,所以我们得去全部加@objc;
在加@objc之前,我们先按住“Command”键和"OCDemo-Swift.h",跳进去看一下
image.png

里面已经根据swift里面的代码,生成对应的OC代码了,目前只有一个init方法;与上面说法这个时候那些没有加@objc的属性和方法还是不能用的;是相符的;

好了,我们赶紧全部加上@objc,再来看一下,ViewController界面有没有提示,同时也再进"OCDemo-Swift.h",里面去看看,会不会生成更多的代码;如下所示,确实如我们所想

image.png

如果我们类中的属性和方法很多怎么办,也需要这么麻烦一个一个加@objc么,这个时候,我们可以使用一个更高级的关键词@objcMembers,加上它后,就相当于,所以属性和方法都加了@objc,如下

image.png

上面已经验证了结论一,结论二,现在我们来验证结论三,swift中的枚举
我们先在Persion.swift文件里面增加枚举,Cmd+B编译一下,没有报错,但此时还没有加@objc

enum.png

当我们加@objc后,就直接报错,需要integer类型


image.png

我们就按报错的提示来进行修改,结果如下


success.png

OC工程pod 引入Swift第三方库文件

结论跟前面一样,使用步骤稍有不同:

一 需要把swift文件里面的struct,改为类,并且继承自NSObject
二 在类文件中需要加@objc 或者@objcMembers
三 swift文件里面如果有枚举类型,能转为OC代码的前提是:

  • 1.加@objc,同上面;
  • 2.枚举的原始值类型是Int型,并且不能有相关值,因为OC里面的枚举只有Int类型,而且没有相关值的概念。
  • 3.swift里面枚举类型不能为可选型,因为OC里面的枚举不可以为空

我们就拿一个swift库来做演示Charts,用cocospod的方式安装到工程里面如下图所示

image.png

使用步骤:

在桥接文件里面导入Charts模块@import Charts;(导入过程可能没有代码提示)
在使用的地方,导入桥接文件#import "OCDemo-Bridging-Header.h",其中OCDemo是项目工程的名称

image.png

然后就可以看到当敲部分chartView代码,编译器就能把各种头文件提示出来,就可以正常使用这个swift库了

Swift工程里面直接拖入使用OC,.h/.m文件

直接拖入一个Student

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Student : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) double score;

-(void)learn;
@end

NS_ASSUME_NONNULL_END
#import "Student.h"

@implementation Student

- (NSString *)name {
    return self.name;
}
- (void)setName:(NSString *)name {
    self.name = name;
}


- (double)score {
    return self.score;
}

- (void)setScore:(double)score {
    self.score = score;
}

- (void)learn {
    NSLog(@"learn");
}
@end
image.png

需要做的,就是在桥接文件SwiftDemo-Bridging-Header.h里面,导入OC的类

#import "Student.h"
image.png

然后就可以在使用的地方,用起来

image.png

Swfit工程里面pod 引入OC第三方库文件

我们先Pod一个纯OC库pod 'SVProgressHUD',
然后步骤同上,先在桥接文件中 导入OC头文件,然后直接使用OC的类,如下图所示

image.png

实践案例

在OC工程里面处理以下几种情况

  1. OC ViewController里调用自定义OC类
  2. OC ViewController里调用Pod进来OC类
  3. OC ViewController里面调用自定义Swift类
  4. OC ViewController里面调用Pod进来Swift类
  1. Swift ViewController里调用自定义OC类
  2. Swift ViewController里调用Pod进来OC类
  3. Swift ViewController里面调用自定义Swift类
  4. Swift ViewController里面调用Pod进来Swift类

有经验的小伙伴,应该会想到为什么有以上的这么种情况,比如:一个OC ViewController 会push到一个Swift ViewController,然后Swift ViewController 又push到下一级OC ViewController;这样的混编场景是可能遇到的,就会遇到上面的8种情况。只有处理好上面的8种情况,才算真正意义上实现了混编。

OC文件使用其他文件的导入方式,处理1~4的情况;如下图


oc文件使用其他文件.png

Swift文件使用其他文件的导入方式,处理5~8的情况;如下图

在桥接文件需要如下的导入方式,这个是重点,这个是重点,这个是重点(这个好像其他博主,都没有提到。),在这里导入后,其他swift文件就可以直接使用 桥接文件导入OC文件和swift文件

桥接文件导入方式.png

swift文件使用其他文件.png

实战demo放在某盘,有需要的小伙伴自取吧
链接: https://pan.baidu.com/s/18dlFqBsl3iCRzhF0CmGHfw 提取码: rwtf
Github地址请点击这里

结尾

今天的分享至此接近尾声喽,小伴们,觉得有点用的话,或者已经看到这里面来的请点赞加关注吧~~ 后续分享更多iOS原生技术及物联网技术相关文章。如果有疑问的话,欢迎在下方留言~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容