繁体   English   中英

标有@objc的Swift类未添加到Objective-C / Swift混合框架的“ -Swift.h”标头中

[英]Swift classes marked with @objc not being added to “-Swift.h” header in mixed Objective-C/Swift framework

我正在尝试将旧的静态链接库转换为框架。 在静态库中混合使用swift和目标c时,可以正确生成所有标头。 但是,切换到框架目标并添加带有@objc标头的swift文件时,该类不会添加到-Swift.h标头中。 我可以导入标头,但找不到快速类。 这在Xcode 10.2中,并且尝试同时使用Swift 4.2和5。

XCode中是否有任何特定设置会影响混合的Objective C / Swift框架目标中* -Swift.h标头的生成?

我有一个类似的问题。 就我而言,这是Xcode 10.2中的一个已知问题:

https://developer.apple.com/documentation/xcode_release_notes/xcode_10_2_release_notes

如果您要构建一个包含Swift代码的框架,并使用lipo创建同时支持设备和模拟器平台的二进制文件,则还必须为每个平台组合生成的Framework-Swift.h标头,以创建同时支持设备和模拟器的标头平台。 (48635615)...

就我而言,我要做的就是将Carthage更新为最新版本0.33.0

问题似乎是苹果新的构建系统,他们在编译时设定的期望以及项目设置中相互依存关系的数量的结合。

新的构建系统并行运行Swift编译。 当具有多个目标库和Swift混合的库/框架依赖项时,编译器似乎未按时生成-Swift.h文件。 在静态库中,-Swift.h文件似乎是在Swift编译过程结束时生成的,这意味着在进行Objective C编译时,生成它们的速度不够快,无法由Objective C文件使用。 生成框架时,似乎编译器会在编译过程开始时生成标头,并且Swift文件未完全编译,并且-Swift.h文件无法使用Objective C类接口和协议正确生成。

这意味着最终的意思是,我们不能依靠“目标依赖项”来正确构建依赖项。

因此,如何在没有大量手动脚本的情况下构建混合了Objective C和-Swift.h的.framework。

这是我发现将起作用的技巧。

  1. 使用旧的构建系统。 当使用新的构建系统时,尝试合并静态库文件的模块映射时出错,表明它找不到* -Swift.h文件,无论它是否存在。
  2. 通过以下方法使框架成为静态库的包装器来创建框架:
    • 给他们两个相同的产品名称和模块名称。
    • 向框架构建中添加一个.Swift文件,以便它可以编译并链接swift库。
    • 链接到框架中的静态库。
    • 将所有必需的标头添加到框架的公共标头。
    • 将所有公共标头添加到伞形标头中。
    • 使用运行脚本阶段可将* -Swift.h文件从静态库版本复制到编译后的框架产品。
    • 对于任何包含* -Swift.h的公共标头,您可能需要对标头进行后期处理,并将* -Swift.h导入替换为适当的框架import。 由于伞头中可能存在周期性导入,因此不建议这样做。
  3. 运行干净时,请先手动构建框架目标,然后再构建应用程序目标。

以下是用于复制* -Swift.h文件发布版本的示例脚本。

header_file="${TARGET_TEMP_DIR}/../${PRODUCT_MODULE_NAME}.build/DerivedSources/${PRODUCT_MODULE_NAME}-Swift.h"
header_dir="${BUILT_PRODUCTS_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}"
mkdir -p "$DIR"
echo "copying $header_file $header_dir"
cp -f "$FILE" "$DIR"

更新

将所有模块都标记为Swift编译模式为“ Whole Module”似乎对这个问题有积极的影响,但是我还没有对其进行全面的测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM