Swift:与OC混编
2022-10-10 本文已影响0人
码小菜
![](https://img.haomeiwen.com/i15969423/09d5bdad471b4721.png)
目录
一,条件编译
二,KVO/KVC
三,Swift调用OC
四,OC调用Swift
五,字符串
六,多线程
一,条件编译
1,代码标记
![](https://img.haomeiwen.com/i15969423/7acb70d70ec89ca1.png)
2,条件编译
![](https://img.haomeiwen.com/i15969423/ad4c1c27a7d2780f.png)
3,信息打印
![](https://img.haomeiwen.com/i15969423/b1477e8da6455174.png)
4,版本检测
![](https://img.haomeiwen.com/i15969423/5d6b24e95fcfd600.png)
5,API可用性
![](https://img.haomeiwen.com/i15969423/f04747d9b4a52df6.png)
6,程序入口
![](https://img.haomeiwen.com/i15969423/67a34faae3b111de.png)
二,KVO/KVC
1,选择器
- 必须是被
@objcMembers
或@objc
修饰的方法才可以定义选择器
![](https://img.haomeiwen.com/i15969423/6ce5b2d9ace7cfa2.png)
2,协议可选方法
- 可以用
@objc
将方法定义为可选的,这种协议只能被类遵守
![](https://img.haomeiwen.com/i15969423/4707aac26105c11a.png)
3,dynamic
- 被
dynamic
修饰的内容具有动态性,比如:调用方法会走runtime
消息发送流程
![](https://img.haomeiwen.com/i15969423/62670acb66f1a972.png)
![](https://img.haomeiwen.com/i15969423/2e54640fc14e34fd.png)
4,KVO/KVC
-
Swift
支持KVO/KVC
的条件: - 属性所在的类、监听器最终继承自
NSObject
- 用
dynamic
修饰对应的属性
![](https://img.haomeiwen.com/i15969423/d7085d0875fe2474.png)
![](https://img.haomeiwen.com/i15969423/0369ea290dce2c7b.png)
5,关联对象
- 默认情况下,在
extension
中不可以添加存储属性
![](https://img.haomeiwen.com/i15969423/e7ba013b5b8ace53.png)
6,资源名管理
![](https://img.haomeiwen.com/i15969423/041e66bfc3c285f7.png)
![](https://img.haomeiwen.com/i15969423/76061a5b6de70d48.png)
![](https://img.haomeiwen.com/i15969423/dc89314eb4b1399a.png)
三,Swift调用OC
1,条件
- 新建一个桥接头文件,文件名格式默认为:
{targetName}-Bridging-Header.h
- 在头文件中
#import
需要暴露给Swift
使用的文件
![](https://img.haomeiwen.com/i15969423/3ac3e93495b9f276.png)
2,OC代码
![](https://img.haomeiwen.com/i15969423/a858a09c0e8e2026.png)
![](https://img.haomeiwen.com/i15969423/05f1391df5e34dda.png)
3,Swift代码
![](https://img.haomeiwen.com/i15969423/b51576c7e57879ce.png)
4,修改函数名
- 如果
C
语言暴露给Swift
的函数名跟Swift
中其他的函数名冲突了,可以在Swift
中使用@_silgen_name
修改C
语言的函数名
![](https://img.haomeiwen.com/i15969423/53ff3ce69047aaff.png)
四,OC调用Swift
1,条件
-
Xcode
默认生成了一个用于OC
调用Swift
的头文件,文件名格式是:{targetName}-Swift.h
-
Xcode
会根据Swift
代码生成对应的OC
声明,并写入该头文件中
![](https://img.haomeiwen.com/i15969423/cd7ac822be422cfd.png)
![](https://img.haomeiwen.com/i15969423/5db8bd8e0bdfd2e2.png)
2,Swift代码
- 暴露给
OC
的类需要最终继承自NSObject
- 使用
@objc
修饰需要暴露给OC
的成员 - 如果想要所有成员都暴露给
OC
,就使用@objcMembers
来修饰类
![](https://img.haomeiwen.com/i15969423/522558ea2547dd60.png)
3,OC代码
![](https://img.haomeiwen.com/i15969423/ec19443e024c6cac.png)
4,修改符号名
- 可以通过
@objc
重命名暴露给OC
的符号名(类名、属性名、方法名等)
![](https://img.haomeiwen.com/i15969423/93ef492be61586b1.png)
![](https://img.haomeiwen.com/i15969423/559abc002f3e8df0.png)
5,调用方法
- 暴露给
OC
的类为何需要继承自NSObject
?
OC
调用方法会走消息发送流程,消息发送流程需要用到isa
指针,而isa
指针是在NSObject
中定义的
-
OC
和Swift
调用方法的区别?
OC
调用方法是走消息发送流程,不论是OC
调用Swift
方法,还是Swift
调用OC
方法;Swift
调用方法是用虚表来实现的
五,字符串
1,String
- 基本使用
![](https://img.haomeiwen.com/i15969423/1f8c4211819264a1.png)
- 插入删除
![](https://img.haomeiwen.com/i15969423/560a32ce1cc4e766.png)
- 多行
![](https://img.haomeiwen.com/i15969423/319aa836ba4c8338.png)
2,Substring
- 子串类型不是
String
,而是Substring
-
Substring
和它的base
,共享一份数据 -
Substring
发生修改或者转为String
时,才会分配新的内存
![](https://img.haomeiwen.com/i15969423/dac3780b62a4953c.png)
![](https://img.haomeiwen.com/i15969423/b0d449138e7caed7.png)
3,Character
![](https://img.haomeiwen.com/i15969423/457d1c7eee5f45f4.png)
4,NSString
-
NSString
和String
可以用as
直接互相转换 -
NSMutableString
可以用as
转换为String
,反之则不可以
![](https://img.haomeiwen.com/i15969423/b4fd86029e1e103e.png)
![](https://img.haomeiwen.com/i15969423/4b5df11aecf83f10.png)
六,多线程
1,异步
![](https://img.haomeiwen.com/i15969423/edf70f9a7d1c9fbf.png)
2,延迟
![](https://img.haomeiwen.com/i15969423/e9ec5bda1ed87a45.png)
3,once
-
dispatch_once
在Swift
中已被废弃 - 可以用类型属性或者全局变量/常量来实现
- 默认自带
lazy
+dispatch_once
的效果
![](https://img.haomeiwen.com/i15969423/3f9421560c3843bc.png)
![](https://img.haomeiwen.com/i15969423/4c7f988e639933e4.png)
4,加锁
![](https://img.haomeiwen.com/i15969423/ba4ed3b460b42348.png)