7

I need to make an library for iOS (either Framework or static library - I haven't decided yet) that can be used in both Objective-C and Swift projects. What is the best way of doing this? The way I see it I have three options:

  1. Write the library in Objective-C and add support for Swift (bridging headers etc).
  2. Write the library in Swift and add support for Objective-C.
  3. Write two libraries, both in Objective-C and Swift. I really want to avoid this option.

The main requirement here is that it should be as easy for developers to use as possible. Ideally, they should be able to choose their language and not care, or indeed even know, what language the library itself was written in. Can this be done?

Also, I want to be able to distribute the library with CocoaPods, if this has any significance.

4

1 回答 1

9

选项2.没有问题(后面会详细介绍)
选项3.正如你所说,你真的应该避免它。

选项 1是最好的。只需考虑使用 Obj-C 和 Swift 设计您的 API。这是什么意思 ?

• 不要使用选择器——它们不是 Swift 标准。
使用可空性转换为可选项
• 闭包和块可能具有相同的语法,但有细微的差别,请注意:

Swift 闭包和 Objective-C 块是兼容的,因此您可以将 Swift 闭包传递给期望块的 Objective-C 方法。Swift 闭包和函数具有相同的类型,因此您甚至可以传递 Swift 函数的名称。

闭包具有与块类似的捕获语义,但在一个关键方面有所不同:变量是可变的而不是复制的。换句话说,Objective-C 中 __block 的行为是 Swift 中变量的默认行为。

资料来源:Apple's Using Swift with Cocoa and Objective-C - 它详细解释了一切。

你可以在这里阅读更多

在设计此类 API 时,您必须知道所有内容是如何转换的,但如果您做得对,用户将不会注意到差异 :)

模块文件

确保您x.framework的产品随附modules文件夹和文件。

新的 Xcode 会为您生成它。这样用户就可以在 Swift 中使用您的 Obj-C 项目,而无需将其添加到桥接文件中。所以他们可以import myLib开箱即用。

在此处输入图像描述

为什么不是斯威夫特?


不幸的是,现在分发编译库最明智的方法是用 Objective-C 编写它。

这是因为一个重要原因:Swift Binary Compatblity Problem

在确保您的应用程序的运行时兼容性的同时,Swift 语言本身将继续发展,二进制接口也将发生变化。为安全起见,应用程序的所有组件都应使用相同版本的 Xcode 和 Swift 编译器构建,以确保它们协同工作。

这意味着需要谨慎管理框架。例如,如果您的项目使用框架与嵌入式扩展共享代码,您将希望一起构建框架、应用程序和扩展。依赖使用 Swift 的二进制框架是很危险的——尤其是来自第三方的。随着 Swift 的变化,这些框架将与您的应用程序的其余部分不兼容。当二进制接口在一两年内稳定下来时,Swift 运行时将成为主机操作系统的一部分,这种限制将不再存在。

PSPDFKit的创始人 Peter Steinberger也是一个作为编译库分发的库,他遇到了同样的问题:他们现在卡在 Obj-C 上,不能使用 Swift

于 2016-04-14T10:40:53.770 回答