1

在 C、C++ 和 Objective-C 中,您可以将可执行文件的一部分编译成它自己的“目标文件”,并通过包含“头文件”从任何其他代码中使用它(和/或包含多个目标文件的库)。尽管有高度模板化的 C++ 代码,但“标头”通常只包含验证调用代码正确性所需的声明(并协助 IDE 进行自动完成等)。

但是 Swift 没有头文件。

现在,显然目前不可能制作一个 Swift 静态库,但是在未来,如果 Swift 没有标头,想要使用“新”源代码中的一些现有预编译代码,这种情况将如何工作?

它会像 [I infer] Java 必须如何工作,编译后的表单可以被内省到足以让编译器验证它是否被正确使用?除了它的中间表示之外,Bitcode 是否还提供了保留此类元数据的必要“协议”?

如果 Apple 将 Cocoa 移植到 Swift(并保持其封闭源代码),那么它将如何“导入”到 Swift 应用程序中?

虽然,实际上,这个问题与“封闭源代码”本身无关,而是试图理解Swift 中编译单元的边界。基于Go 语言的一个类似问题,我的这里可以改写为:你可以链接到没有源代码的预编译 Swift 库吗?

4

2 回答 2

1

好吧,考虑一下 Apple 的 Swift 库。它们是闭源的,你可以很好地使用它们,你可以在编译器的库中看到伪“标题”。目前尚未公开记录其工作原理的确切机制,但它必须存在。

于 2015-06-23T22:47:30.723 回答
0

除了@user102008,好消息是,Swift 将在今年年底开源,甚至被苹果移植到 Linux。虽然我们不能保证它会一直这样工作(因为苹果在这类问题上的记录很差),但即使苹果没有兴趣这样做,人们也会在其中找到合适的解决方案。

更重要的是,afaik,Swift 对象实际上是 Objective-C 对象。让 Swift 工作与 Objective-C 没有什么不同。(更多详细信息:http: //www.eswick.com/2014/06/inside-swift/)编译完成后,只需进行类转储(或将其加载到 IDA 等调试器中),您就可以轻松创建一个.h 使其像普通的静态库或框架一样工作。

于 2015-06-23T23:01:23.253 回答