目录
一,条件编译
二,KVO/KVC
三,Swift调用OC
四,OC调用Swift
五,字符串
六,多线程
一,条件编译
1,代码标记
2,条件编译
3,信息打印
4,版本检测
5,API可用性
6,程序入口
二,KVO/KVC
1,选择器
- 必须是被
@objcMembers
或@objc
修饰的方法才可以定义选择器
2,协议可选方法
- 可以用
@objc
将方法定义为可选的,这种协议只能被类遵守
3,dynamic
- 被
dynamic
修饰的内容具有动态性,比如:调用方法会走runtime
消息发送流程
4,KVO/KVC
-
Swift
支持KVO/KVC
的条件: - 属性所在的类、监听器最终继承自
NSObject
- 用
dynamic
修饰对应的属性
5,关联对象
- 默认情况下,在
extension
中不可以添加存储属性
6,资源名管理
三,Swift调用OC
1,条件
- 新建一个桥接头文件,文件名格式默认为:
{targetName}-Bridging-Header.h
- 在头文件中
#import
需要暴露给Swift
使用的文件
2,OC代码
3,Swift代码
4,修改函数名
- 如果
C
语言暴露给Swift
的函数名跟Swift
中其他的函数名冲突了,可以在Swift
中使用@_silgen_name
修改C
语言的函数名
四,OC调用Swift
1,条件
-
Xcode
默认生成了一个用于OC
调用Swift
的头文件,文件名格式是:{targetName}-Swift.h
-
Xcode
会根据Swift
代码生成对应的OC
声明,并写入该头文件中
2,Swift代码
- 暴露给
OC
的类需要最终继承自NSObject
- 使用
@objc
修饰需要暴露给OC
的成员 - 如果想要所有成员都暴露给
OC
,就使用@objcMembers
来修饰类
3,OC代码
4,修改符号名
- 可以通过
@objc
重命名暴露给OC
的符号名(类名、属性名、方法名等)
5,调用方法
- 暴露给
OC
的类为何需要继承自NSObject
?
OC
调用方法会走消息发送流程,消息发送流程需要用到isa
指针,而isa
指针是在NSObject
中定义的
-
OC
和Swift
调用方法的区别?
OC
调用方法是走消息发送流程,不论是OC
调用Swift
方法,还是Swift
调用OC
方法;Swift
调用方法是用虚表来实现的
五,字符串
1,String
- 基本使用
- 插入删除
- 多行
2,Substring
- 子串类型不是
String
,而是Substring
-
Substring
和它的base
,共享一份数据 -
Substring
发生修改或者转为String
时,才会分配新的内存
3,Character
4,NSString
-
NSString
和String
可以用as
直接互相转换 -
NSMutableString
可以用as
转换为String
,反之则不可以
六,多线程
1,异步
2,延迟
3,once
-
dispatch_once
在Swift
中已被废弃 - 可以用类型属性或者全局变量/常量来实现
- 默认自带
lazy
+dispatch_once
的效果