我正在尝试将常用的Swift代码集中到一个框架中,其中一部分代码使用Google Analytics(分析)。我以Cocoapod的身份引入了Google Analytics(分析),但是我无法像在原始项目中那样从新框架中访问它,因为它是Objective-C,并且框架中没有桥接头支持[我正在使用Swift 1.2]。
我通常在桥接标头中包含的代码行可以完成所有这些工作:
#import <Google / Analytics.h>
我究竟将其放置在项目中的什么位置,以使其像以前在桥接头中所做的那样工作?
我在Apple文档中发现有关混合Swift和Objective-C的内容是:
从同一框架目标中导入代码
如果您正在编写混合语言框架,则可能需要从Swift访问Objective-C代码和从Objective-C访问Swift代码。
将Objective-C导入Swift
要在与Swift代码相同的框架目标中导入一组Objective-C文件,您需要将这些文件导入框架的Objective-C伞形标头中。
从同一框架将Objective-C代码导入Swift
在“打包设置”下的“构建设置”下,确保该框架目标的“定义模块”设置被设置为“是”。在您的伞形头文件中,导入要公开给Swift的每个Objective-C头。例如:OBJECTIVE-C
导入<XYZ / XYZCustomCell.h>
导入<XYZ / XYZCustomView.h>
导入<XYZ / XYZCustomViewController.h>
我认为最相关的一句话是:
您需要将这些文件导入框架的Objective-C伞式标头
但是,此文件是什么以及如何创建它?
Apple的文档前面提到(在表格中):
Objective-C代码
导入到Swift
#import“ Header.h”
好吧,我尝试只创建一个文件“ Header.h”并导入它,但这是行不通的。我不知道他们想说什么。我在构建设置中找不到任何“伞”。
所以我的问题是,如何在我的Swift项目中导入此文件(#import <Google / Analytics.h>),以便可以像正常项目的桥接头中那样看到Google Analytics(分析)cocoapod框架?
更新:
我已经相信,objective-c桥接头文件可能是与项目同名的.h文件。我现在尝试在其中添加import语句,得到的错误是:
!在框架模块“ JBS”中包含非模块化头
解决方案并不像应用程序那么简单。我们必须创建一个模块映射。
看一下这个示例仓库。
在Swift代码内部,我们只能导入所谓的模块。诀窍是定义一个模块,该模块又包含我们需要Swift代码访问的所有ObjC标头。
的模块图部分这篇文章也可以帮助你。
尽管桥接头很方便,但它有一个关键的限制-您不能在框架项目中使用它。替代方法是使用模块。
为此,请在项目目录中创建一个要使用的库命名的目录。我在Xcode主持下的Shell中进行了此操作,将其命名为CommonCrypto。在目录内,创建一个封装库设置的module.map文件。对于CommonCrypto,module.map如下所示:
module CommonCrypto [system] { header "/usr/include/CommonCrypto/CommonCrypto.h" export * }
现在,将新模块添加到项目设置中“ Swift Compiler –搜索路径”下的“导入路径”。在模块路径中使用$ {SRCROOT}(例如$ {SRCROOT} / CommonCrypto)以确保该项目无论在何处签出都可以正常工作。
这样就可以将Swift中的CommonCrypto导入。请注意,使用此技术构建的任何框架的使用者也必须将模块添加到其Swift搜索路径中。
我按照上面文章中的步骤进行操作,并通过以下方式使其适合我的需要:
module Muse { header "Muse.framework/Headers/Muse.h" export * }
[system]
为了安全起见,我删除了lexon(因为它删除了警告),并将框架放在了module.map文件所在的文件夹中。
此外,如果libc++.tbd
需要,请不要忘记在框架目标中(在选项卡的Linked Frameworks and Libraries
部分中General
)包含和其他必需的依赖项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句