OC 与 Swift 混编

718 阅读1分钟

无论在 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 里导入头文件。

截屏2021-12-22 上午11.04.01.png

// 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 的消息机制;