从另一个目标获取Swift umbrella头文件

4
我有一个项目,包含多个目标。主要目标是将 Swift 和 Objective-C 类和 objc 文件组合在一起,并通过包含 ModuleName-Swift.h 总头文件来使用 Swift 类。然而,当我将相同的源文件包含到多个目标中时,总头文件只能在主目标中找到。头文件导入中的模块名称应该对于每个目标都不同。如何实现这一点?
更新: 到目前为止,我没有发现任何其他方法,只有为所有目标设置相同的 Product Module Name。这似乎没有任何副作用。
2个回答

2
我在编写我的应用程序的 Today Extension 时遇到了相同的问题。我有一个名为 Items.swift 的文件,位于 Today extension 组件中,并包含在该目标中。因此,我有以下情况:主项目完全使用 Objective-C 编写,而 Today extension 使用 Swift 编写。
问题:
我想将文件 Items.swift 包含到主项目中并使用它。
解决方案:
  1. 确保 Items.swift 包含在主应用程序目标中
  2. 重要(!!!)即使您的主目标仅包含 Objective-C 代码,也应创建 "ProductModuleName-Bridging-Header.h" 并在项目文件中添加对此文件的引用(Objective-C Bridging Header 选项)
  3. 您的 Items.swift 应继承自 NSObject 或其后代
  4. 然后,在要使用 Items.swift 的位置添加 #import "ProductModuleName-Swift.h" 并按 Build 键
最后,您可以转到 "ProductModuleName-Swift.h" 并确保生成接口,然后您可以使用 Objective-C 版本的类。
你可以在“构建设置”->“打包”->“产品模块名称”中查看ProductModuleName。

如果我的主目标中有很多objc文件,并且需要将所有这些文件添加到今天的扩展中,我该如何添加这些文件而不重复呢? - Rafeek
@Rafeek,你不能这样做。Today Extension是另一个项目。所以,你需要从你的主项目中创建框架部分,并将这个框架添加到你的Today Extension中。 - gaussblurinc
这并没有回答我的问题,如何在相同的文件中包含相同的Umbrella头文件,这些文件只是添加到不同的目标中。 - Tapani

0

首先,我想澄清一下混淆的问题,ModuleName-Swift.h是Swift编译器生成的头文件,用于在Objective-C中使用Swift代码,而伞头文件ModuleName.h是框架目标的头文件,用于将Objective-C代码暴露给Swift。

无论如何,根据我的理解,您想要在多个目标共享的文件中导入一种目标名称形式的头文件。为此,您可以定义一个预处理宏,为每个目标定义不同的值,并在您的Objective-C文件中使用宏值来导入头文件,即#import macro

假设您的示例中想要在共享文件中导入Swift生成的头文件ModuleName-Swift.h。生成的头文件名称在构建设置中可用,称为SWIFT_OBJC_INTERFACE_HEADER_NAME。您可以在预处理器宏部分(GCC_PREPROCESSOR_DEFINITIONS)中创建一个名为SWIFT_HEADER的宏,用于该头文件名称:

# '\' is important to preserve '"'
SWIFT_HEADER=\"$(SWIFT_OBJC_INTERFACE_HEADER_NAME)\"

然后在你的Objective-C文件中使用这个宏进行导入:

#import SWIFT_HEADER

此外,您可以创建一个单个的xcconfig文件,添加这个预处理器宏,并将其共享给所有目标。
# '\' is important to preserve '"'
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) SWIFT_HEADER=\"$(SWIFT_OBJC_INTERFACE_HEADER_NAME)\"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接