无论在 OC 项目调用 Swift 代码,还是在 Swift 项目中调用 OC 代码,都需要创建桥接文件,文件名格式为:[Target Name]-Bridging-Header.h。
OC 中调 Swift
要想 Swift 代码可以在 OC 中调用,需要满足以下几个条件:
- 必须继承自 NSObject。
- 想要暴露的方法或属性需要用
@objc修饰;或者用@objcMembers将整个类都暴露。 - 在 OC 代码中导入头文件:
#import "[Target Name]-Swift.h"(该头文件项目自动创建)。
Swift 代码示例
@objcMembers class Person: NSObject {
var name = "jack"
init(name: String) {
print(name)
}
}
OC 调用代码示例
#import "TestOC-Swift.h"
Person *p = [[Person alloc] initWithName:@"abc"];
需要注意的是,@objc 还可以对定义的类、属性和方法进行重命名,使 Swift 代码更加符合 OC 的命名规范:
// Swift
@objc(XYPerson)
@objcMembers class Person: NSObject {
......
}
// OC
XYPerson *p = [[XYPerson alloc] initWithName:@"abc"];
Swift 中调 OC
若想在 Swift 中调用 OC 代码,则需在 [Target Name]-Bridging-Header.h 里导入头文件。
// Swift 调用 OC
class Person: NSObject {
var stu = Student()
func run() {
stu.name = "rose"
print(stu.name)
}
}
注意点
- 当 Swift 调用 OC 的方法时,方法的调用过程是走的 runtime 的消息机制;
- 当 OC 调用 Swift 中的函数时,函数调用过程也是走的 runtime 的消息机制;
- 当 Swift 继承自 NSObject,在 Swift 环境中调用 Swift 函数时,函数调用走的是 Swift 的函数派发机制,而不是 runtime 的消息机制;