Objective-C 如何调用 Swift 方法?

How is Objective-C able to call Swift methods?

随着项目的 Swift 伞 header 添加,Objective-C 能够访问 Swift class 方法。 Objective-C 如何能够调用 Swift 方法,但 C 无法在不处理名称修改问题的情况下调用?

能否提供详细信息?


ABI 不稳定 Swift 意思是,编译器会为类型生成固定的错位名称?那么我们是否可以有一个程序来遍历 Swift 源代码并生成一个 header 具有错位的名称,可以从 C 调用?

调用 swift 函数作为 Objective-C 函数添加

@objc

函数前面

它的编译器魔法由 @objc 属性启用。当您将方法、协议、class 或变量标记为 @objc 时,编译器实际上会生成一个带有适当 objective C 选择器和名称的 thunk 或存根函数,以便它可以由 objective C 运行 时间调用,然后该 thunk 将调用基础 Swift 函数。请注意 Swift dispatch 和 Object message send 是两个完全不同的东西;它不仅是方法名称,还有查找函数指针的方式([=19= 的 v table,objc c 的字符串选择器)和传递参数的方式。编译器在幕后做了很多工作来实现这一点,包括跨语言桥接参数(NSString 到 String 等)。