react-native 创建一个具有新架构的模块并包含一个 .swift 文件引入编译器错误

uyto3xhc  于 4个月前  发布在  React
关注(0)|答案(9)|浏览(58)

描述

我正在升级我们其中一个使用Swift编写逻辑的开源库。然而,当我在podspec source_files中包含swift时,我遇到了编译器错误。

重现步骤

我在更新模块的podspec以在ios/目录中包含.swift文件后遇到了编译器错误。

s.source_files = "ios/**/*.{h,m,mm,cpp,swift}" <--- adding Swift

构建开发pod后,我得到了这个错误:

我找到了一个解决方法,即省略以下内容:
1.

s.source_files = "ios/**/*.{h,m,mm,cpp}" <--- remove swift
  1. run bundle exec pod install
    1.手动添加.swift文件

构建项目后,没有编译器错误。这对于测试来说很好,但我需要更新podspec以将文件包含在Compile Sources中,否则,还会出现其他错误。

React Native版本

0.74.0

受影响的平台

运行时-iOS

领域

TurboModule - 新的本地模块系统

npx react-native info的输出

System:
  OS: macOS 14.4.1
  CPU: (8) arm64 Apple M1
  Memory: 175.06 MB / 16.00 GB
  Shell:
    version: "5.9"
    path: /bin/zsh
Binaries:
  Node:
    version: 18.18.0
    path: ~/.nvm/versions/node/v18.18.0/bin/node
  Yarn:
    version: 3.6.4
    path: /opt/homebrew/bin/yarn
  npm:
    version: 9.8.1
    path: ~/.nvm/versions/node/v18.18.0/bin/npm
  Watchman:
    version: 2024.04.15.00
    path: /opt/homebrew/bin/watchman
Managers:
  CocoaPods:
    version: 1.15.2
    path: /Users/gary/.rvm/gems/ruby-2.7.5/bin/pod
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 23.5
      - iOS 17.5
      - macOS 14.5
      - tvOS 17.5
      - visionOS 1.2
      - watchOS 10.5
  Android SDK:
    API Levels:
      - "29"
      - "30"
      - "31"
      - "32"
      - "33"
      - "34"
    Build Tools:
      - 28.0.3
      - 30.0.2
      - 30.0.3
      - 31.0.0
      - 32.0.0
      - 32.1.0
      - 33.0.0
      - 33.0.1
      - 34.0.0
    System Images:
      - android-32 | Google APIs ARM 64 v8a
      - android-32 | Google Play ARM 64 v8a
      - android-33 | Google APIs ARM 64 v8a
      - android-33 | Google Play ARM 64 v8a
      - android-Tiramisu | Google APIs ARM 64 v8a
    Android NDK: 22.1.7171670
IDEs:
  Android Studio: 2023.2 AI-232.10300.40.2321.11668458
  Xcode:
    version: 15.4/15F31d
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 17.0.12
    path: /usr/bin/javac
  Ruby:
    version: 2.7.5
    path: /Users/gary/.rvm/rubies/ruby-2.7.5/bin/ruby
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 18.3.1
    wanted: 18.3.1
  react-native:
    installed: 0.75.2
    wanted: 0.75.2
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: true
  newArchEnabled: true
iOS:
  hermesEnabled: true
  newArchEnabled: true

堆栈跟踪或日志

n/a

可复现问题

https://github.com/candlefinance/oss/tree/feat-convert-send-na

截图和视频

  • 无响应*
8ulbf1ek

8ulbf1ek1#

⚠️React Native的新版本可用!
i️您正在使用受支持的次要版本,但似乎有一个更新的补丁可用 - 0.74.5。请升级到您次要版本的最高补丁或最新版本,并验证问题是否仍然存在(或者,创建一个新项目并在其中重现问题)。如果无法重现,请告知我们,以便我们关闭此问题。这有助于确保我们关注仍在最近版本中存在的问题。
13z8s7eq

13z8s7eq2#

⚠️缺失可复现示例
i️我们无法在您的问题报告中检测到可复现的示例。请提供以下内容:* 如果您的错误与UI相关:一个 Snack* 如果您的错误与构建/更新相关:使用我们的 Reproducer Template 。需要在您用户名下的GitHub仓库中有一个复现器。
bxjv4tth

bxjv4tth3#

⚠️React Native的新版本可用!
i️您正在使用受支持的次要版本,但似乎有一个更新的补丁可用 - undefined。请访问您次要版本的最高补丁或最新版本并验证问题是否仍然存在(或者,创建一个新项目并在其中重现问题)。如果无法重现,请告知我们,以便我们关闭此问题。这有助于确保我们关注仍在最近版本中存在的问题。
ibrsph3r

ibrsph3r4#

⚠️缺失可复现示例
i️我们无法在您的问题报告中检测到可复现的示例。请提供以下内容:* 如果您的错误与UI相关:一个 Snack* 如果您的错误与构建/更新相关:使用我们的 Reproducer Template
fnx2tebb

fnx2tebb5#

@gtokman 看到你添加了标签,你有权限删除上面的评论吗?几乎肯定是恶意软件。

aiazj4mn

aiazj4mn6#

感谢gtokman提出的问题。以下是几点:

  1. Swift尚未得到新架构的官方支持。我知道这是一个很大的缺失,但目前我们没有资源去处理这个问题。我希望这能尽快实现。

  2. Swift和C++的配合并不理想。是的,我们有Swift/Cxx互操作性,但遗憾的是它并不完整,而且我认为它还不够稳定,无法使用。

1.看起来你的pod在一些尝试导入<memory> C模块的swift文件之前失败了。这也可能发生在传递依赖关系中。Swift无法导入C模块,因此出现了失败。

cld4siwp

cld4siwp7#

感谢cipolleschi提供的上下文。
1.看起来你的pod在尝试导入<memory> C模块之前就失败了。这也可能发生在传递依赖关系中。Swift无法导入C模块,因此导致失败。
我提到我找到了一个解决方法。我的猜想是构建设置没有正确设置,导致如果我包含Swift source_files时pod编译失败。你有什么想法吗?我想尝试比较生成的.xcodeproj.与手动添加文件的不同之处。

odopli94

odopli948#

当你手动添加Swift文件时,Xcode通常会创建一些桥接头文件和额外的配置文件。我们需要查看生成的内容,以了解Xcode如何解决这个问题,然后将这些文件"提交"到库中。如果我能找到时间去研究一下,但这可能需要几周的时间,因为下周我们有React Universe,而我将在波兰参加会议。

mctunoxg

mctunoxg9#

当你手动添加Swift文件时,Xcode通常会创建一些桥接头文件和额外的配置文件。我们需要查看生成的内容,以了解Xcode如何解决这个问题,然后将这些文件“提交”到库中。

如果有时间的话,我会花些时间去研究一下,但很可能在几周内就会发生,因为下周我们有React Universe会议,我将前往波兰参加。

感谢@cipolleschi!

我在Xcode中看到了桥接头文件的警告,但我没有创建它。桥接头文件用于Obj-C到Swift的转换。要使用Swift到Obj-C,你只需要导入生成的Swift头文件,例如Send.swift -> #import "candlefinance_send-Swift.h"

相关问题