来自 Swift 应用程序的 Objective C 库中定义的引用类型

Posted

技术标签:

【中文标题】来自 Swift 应用程序的 Objective C 库中定义的引用类型【英文标题】:Reference types defined in Objective C Library from Swift Application 【发布时间】:2015-03-15 18:47:28 【问题描述】:

我通常是一个习惯使用 Visual Studio 的 .NET 开发人员,所以如果我在 ios 术语中弄错了一些地方,请原谅我。

我要做的是在新的 Swift iOS 应用程序中引用在 Objective-C 库中定义的类型。

具体来说,我正在尝试使用 [this article(https://danielsaidi.wordpress.com/2014/09/04/my-approach-to-ioc-in-ios/) 的作者所描述的 CoreMeta 库使依赖注入工作。

在 XCode 中,我使用 swift 创建了一个新的空白单视图应用程序,并添加了对文章中提到的 CoreMeta 库的引用(注意:我对 Xcode 在添加参考。我尝试将库拖放到 swift 应用程序上并将两个项目添加到新工作区,但两种方法都会导致我将要描述的相同问题)

我知道我需要一个桥接头,所以我右键单击 swift 项目并添加一个新文件,选择头文件并添加一个格式为 projectname-bridging-header.h 的新标头。

我阅读的文档建议 Xcode 应该为我创建这个,但我没有弹出这个对话框。

在 swift 项目的构建设置中,在常规选项卡下,我添加了 libCoreMeta.a 文件(我假设这是来自 objc 库的构建程序集),并在 Swift 编译器 - 代码生成下的构建设置中我有指向我添加的文件的桥接头值。

这是我可能会感到困惑的地方。在桥接头文件中,我尝试执行的导入语句的每个变体都会导致“找不到文件”错误,因此在应用程序的其余部分中不能使用任何类型。

在文章中,IoCContainer 对象是在 NSObject+IoCContainer.h 中定义的,因此 #import "NSObject+IoCContainer.h" 的任何变体似乎都不起作用。

我确定这是我在这里很明显地遗漏的东西,所以任何帮助都会很棒。

编辑

为了简单起见,我刚刚创建了一个新的 swift 应用程序,向其中添加了 CoreMeta 库,添加了一个 ObjectiveC 文件(并获得了创建桥接头的请求),但我仍然无法确定要添加到桥接头中的内容标头来访问 CoreMeta 库中的内容。下面的文件结构

和 TestSwiftApp-Bridging-Header.h

我显然对命名空间和东西如何与 iOS 一起工作存在知识差距

【问题讨论】:

一些关于您实际操作的屏幕截图会有所帮助,因此我们可以确保您在正确的地方做正确的事情。 更新了一些图片 【参考方案1】:

Xcode 提供为您创建一个桥接头。当您单击 File -> New -> File... 然后选择在 Objective-C 项目中创建 Swift 文件或在 Swift 项目中创建 Objective-C 文件时,它会执行此操作:


不过,您无需执行这些步骤即可创建桥接头。

重要的不是桥接头名称的格式。桥接头可以具有您选择的任何名称。重要的是在您的构建设置中将哪个文件设置为桥接头。

首先,在您的项目中创建任何头文件。

在你的Project Navigator,点击目标:

现在点击这里的目标:

并在此处选择“构建设置”:

一直向下滚动到名为“Swift 编译器 - 代码生成”的部分:

请注意:只有当您有 .swift 文件要编译时,此部分才会实际显示。如果您的项目没有正在编译的任何 .swift 文件,那么将已经很混乱的构建设置选项与您甚至没有包含在项目中的语言的一整套选项混在一起是没有意义的。支持>

如果 Xcode 从未为您提供自动配置桥接头的选项,则“Objective-C Bridging Header”行将是空白且未选择任何文件。您所要做的就是点击那里并输入您的新文件名:

有趣的事情要注意...如果有必要,您可以定义不同的 Debug 和 Release 构建桥接头。


最后一点说明您在将库的头文件导入到要用作桥接头的文件中时遇到的麻烦:您必须实际获取您正在使用的库的头文件的副本使用。您不能只将.a 文件放入您的项目中。您需要该库附带的 .a 和任何/所有相应的 .h 文件。因此,请确保您的项目中有 .h 文件以及正确设置的桥接头。

【讨论】:

以上是关于来自 Swift 应用程序的 Objective C 库中定义的引用类型的主要内容,如果未能解决你的问题,请参考以下文章

来自 Swift 应用程序的 Objective C 库中定义的引用类型

在 swift 数据模型中使用来自 Objective-C++ 框架的数据类型

在 swift 数据模型中使用来自 Objective-C++ 框架的数据类型

匹配来自 Objective-C 协议实例的 Swift 协议

UIColor swift 扩展,带有来自 Objective-C 的类访问

来自 Swift 的 CGRect 和 CGSize 扩展在 Objective-C 中不可见