据我了解,Swift 和 Objective-C 是可以互操作的。主要用 Swift 编写的项目可以使用 Objctive-C 库(甚至 C 和 C++ 库),反之亦然。
我知道 Java 和 Kotlin 可以做到这一点,因为它们具有相同的运行时(JVM)。但我读到 Swift 有自己的运行时,与 Objective-C 的运行时分开。那么 Swift 和 Objective-C 如何互操作呢?
具有相同的运行时并不是互操作性的必要条件,但它确实使两种语言的互操作变得更加容易。
可以说,Kotlin 和 Java 也没有“相同”的运行时。 Kotlin 有自己的运行时,构建在 JDK/JVM 之上。这就是 suspend
函数、Kotlin 反射和其他 Kotlin 特定功能发挥作用的原因。
。 它们都在 JVM 上运行,其中很多都是“免费”提供的。 Kotlin 的编译器可以将 Kotlin 方法输出为 JVM 方法,将 Kotlin 类输出为 JVM 类,从 Kotlin 调用 Java 方法会生成与从 Java 调用 Java 方法基本相同的字节码,等等
类似地,当您在 Swift 中调用 Objective-C 方法时,
swiftc
只会输出与
clang
为该方法调用输出的指令相同的指令,就好像某些 Objective-C 代码调用了它一样。如果某个类在 Swift 中标记为 @objc
,则 swiftc
会为该类生成 Objective-C 标头,就像它是 Objective-C 类一样,依此类推。理论上,Swift 可以与 Java 进行互操作。人们可以编写一个输出 Java 字节码的 Swift 编译器。
具有相同的运行时间也不是互操作性的充分条件。 Kotlin 的编译器会生成合成成员来实现 Kotlin 的一些语言功能,而 Java 编译器会忽略这些功能。同样,并非每个 Swift 声明都对 Objective-C 可见(例如具有关联类型的协议),并且不仅仅是简单常量的 Objective-C 宏对 Swift 也不可见。