尽管运行时不同,但 Swift 和 Obective-C 如何互操作?

问题描述 投票:0回答:1

据我了解,Swift 和 Objective-C 是可以互操作的。主要用 Swift 编写的项目可以使用 Objctive-C 库(甚至 C 和 C++ 库),反之亦然。

我知道 Java 和 Kotlin 可以做到这一点,因为它们具有相同的运行时(JVM)。但我读到 Swift 有自己的运行时,与 Objective-C 的运行时分开。那么 Swift 和 Objective-C 如何互操作呢?

ios swift objective-c xcode objective-c-runtime
1个回答
0
投票

具有相同的运行时并不是互操作性的必要条件,但它确实使两种语言的互操作变得更加容易。

可以说,Kotlin 和 Java 也没有“相同”的运行时。 Kotlin 有自己的运行时,构建在 JDK/JVM 之上。这就是 suspend 函数、Kotlin 反射和其他 Kotlin 特定功能发挥作用的原因。

重要的是 Kotlin 的编译器可以输出 Java 编译器可以理解的二进制文件,而 Java 编译器可以输出 Kotlin 编译器可以理解的二进制文件。也就是说,编译器遵循彼此的 

ABI

它们都在 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 也不可见。

© www.soinside.com 2019 - 2024. All rights reserved.