如何为Objective-C和Swift创建通用iOS库?

paj*_*vic 6 objective-c ios ios-frameworks swift ios-library

我需要为iOS(框架或静态库 - 我还没有决定)创建一个可以在Objective-C和Swift项目中使用的库.这样做的最佳方式是什么?我看到它的方式我有三个选择:

  1. 在Objective-C中编写库并添加对Swift(桥接头等)的支持.
  2. 在Swift中编写库并添加对Objective-C的支持.
  3. 在Objective-C和Swift中编写两个库.我真的想避免这个选择.

这里的主要要求是开发人员应尽可能轻松地使用它.理想情况下,他们应该能够选择他们的语言而不关心,或者甚至不知道图书馆本身的语言是什么.这可以做到吗?

此外,我希望能够使用CocoaPods分发库,如果这有任何意义.

mic*_*rus 9

选项2.没有问题(稍后详细说明)
选项3.如你所说,你应该真的避免它.

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

•不要使用选择器 - 它们不是Swift标准.
使用nullability转换为可选项
•闭包和块可能具有相同的语法,但略有不同,请注意:

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

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

来源:Apple 使用Swift与Cocoa和Objective-C - 它详细解释了所有内容.

你可以在这里阅读更多.

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

模块文件

确保x.framework随附modules文件夹和文件.

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

在此输入图像描述

为什么不是斯威夫特?


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

这是因为一个重要原因:Swift Binary Compatiblity问题

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

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

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

  • 是的,内部使用它很好.你不应该在公共API中使用它. (2认同)