构建纯 Swift Cocoa Touch 框架

Posted

技术标签:

【中文标题】构建纯 Swift Cocoa Touch 框架【英文标题】:Building pure Swift Cocoa Touch Framework 【发布时间】:2014-06-05 21:45:55 【问题描述】:

我正在使用 Xcode-6 探索 Swift,到目前为止一切都很好,尽管我认为新集合需要一些工作,因为我已经成功地破坏了编译器几次。

问题是我现在被困在尝试创建框架包以然后在另一个项目中使用。项目构建没有问题,所有测试都成功通过。当我去创建存档(我认为这是必需的)时,我收到错误:

:0: 错误:未找到底层 Objective-C 模块“示例”

现在我假设这与我的 Sample.h 的内容有关,它告诉我

// In this header, you should import all the public headers of your framework using statements like #import <Sample/PublicHeader.h>

这很好,只是我只为这个框架使用了 swift 枚举、结构和类,因此不存在 .h 文件。

由于我找不到任何可用的文档,任何人都可以对此有所了解吗?

【问题讨论】:

为什么是存档框架? 您是否尝试过构建一个纯 swift 框架项目并在同一工作区中的客户端应用程序中使用它?如果是这样,它有效吗? 【参考方案1】:

编辑(2018 年 7 月 27 日)

以下答案中的信息可能不再准确。您的里程可能会有所不同。


我和一位工程师坐下来问了这个确切的问题。这是他们的回应:

Xcode 6 目前不支持构建可分发的 Swift 框架,Apple 可能不会将此功能构建到 Xcode 中,直到这样做对他们有利。现在,框架旨在嵌入到应用程序的项目中,而不是分发。如果您观看任何会议视频或查看示例项目,这始终是安排。 Another reason is that Swift is very new and likely to change. Thus your Swift-based framework is not guaranteed to work on the platform you originally built it on.

轻微更新

工程师提到做分发框架也不是不可能,只是不支持而已。

【讨论】:

这与苹果的文档有直接冲突:developer.apple.com/library/prerelease/ios/documentation/Swift/… 那些文档仍处于“预发布”状态,因此可能会发生变化 此外,他们并没有说不可能构建一个框架并在单独的项目中使用它。他们只是说不支持。您是否尝试过构建 Swift 框架目标以用于不同的项目? 是的,我一直在保持粉末干燥并试图找到有效和无效的界限,但目前一切正常。我怀疑(至少)存在以下限制:如果他们修改 swift 语言,尽管承诺的二进制兼容性,应用程序及其所有框架都必须使用相同的二进制版本构建。 Xcode 6 发布后,我们确定不支持 iOS Swift 框架吗?我在文档/注释中找不到确认信息。它是 XCode for Frameworks 中的一个选项。对于任何有兴趣的人,这里是我如何设置我的项目的一步一步。这是错的吗? github.com/mikemoser/swift-framework @MichaelMoser 它们受支持,但仅作为作为单个项目一部分的框架。原生不支持的是打破该框架以在其他项目中使用它(参见 OP 的第二段,第一句)或将其分发给某人。【参考方案2】:

我能够通过转到框架的目标并在标题下的构建阶段选项卡上删除 MyFramework.h 文件来克服错误

但是,当我使用框架在包含应用程序和应用程序扩展程序(两者都是纯 Swift)之间共享代码时,我收到了“找不到底层 Objective-C 模块”错误。

【讨论】:

这帮助我解决了同样的问题。虽然它并没有真正告诉我出了什么问题......无论如何,谢谢! :)【参考方案3】:

假设您正在创建一个真正纯 Swift 模块,您必须禁用 Objective-C 兼容性头文件和任何生成的接口头文件,这样编译器就不会假设它可以为框架找到一个 Objective-C 模块。

不要删除您的公共框架标头。如果这样做,您将在链接时收到模块映射警告。

【讨论】:

【参考方案4】:

您可能会发现这很有用:Creation of pure swift module

简而言之:可以制作静态框架,但有一个问题:如果包含“ProjectName-Swift.h”标头,它在最终用户的项目中不起作用。

但是,如果你只使用 swift 就可以了。

【讨论】:

你能扩展一下吗?【参考方案5】:

我认为这是 XCode 6 中的一个错误,或者 Apple 不允许在测试版中从 XCode 归档框架。

如果您编译以分析 XCode,则会正确生成框架。 (参见 DerivedData 中创建的 Release 文件夹)

【讨论】:

以上是关于构建纯 Swift Cocoa Touch 框架的主要内容,如果未能解决你的问题,请参考以下文章

如何将用 Swift 编写的 Cocoa Touch 框架导入 .pch 文件?

Cocoa Touch 框架无法在嵌入项目中的模拟器上调试

带有嵌入库的 Cocoa Touch Framework Swift

最终构建中是不是包含未使用的 Cocoa Touch 框架?

在 Cocoa Touch 框架中包装静态库

《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式