XCode 12:“SessionDelegate”在不同模块中有不同的定义

Fer*_*baş 28 xcode swift alamofire kingfisher xcode12

编辑: 此问题发生在 XCode 12 Beta5 之后。Xcode 不允许不同的模块定义相同的名称(可能用于公共类和协议)。Alamofire 和 Kingfisher 似乎同时定义了 SessionDelegate。我仍在努力寻找解决方案..

我正在我们的应用程序中实现 iOS 14 小部件。我已经开始使用XCode 12 Beta 2并且一切都编译得很好。当我将XCode更新到XCode 12 Beta 6 时,我遇到了以下错误:

'SessionDelegate'在不同的模块中有不同的定义;第一个区别是模块“Kingfisher.Swift”中的定义发现类结束

我还附上了错误文件的屏幕截图。

在此处输入图片说明

有什么方法可以编辑头文件,为 Alamofire 或 Kingfisher 的 SessionDelegate 使用不同的名称?有什么解决方法可以克服这个问题吗?

以下是我迄今为止尝试过的事情:

  • 我已将 Alamofire 和 Kingfisher 都更新到最新版本
  • 我已经清理了Podfile.lock和所有 Pod 以及派生数据
  • 我尝试使用Legacy Build System进行编译

sam*_*sam 21

你可以试试 SWIFT_INSTALL_OBJC_HEADER = NO,它对我有用

在此处输入图片说明

  • 转至 Project、Build Settings,选择 All 选项卡,搜索 SWIFT_INSTALL_OBJC_HEADER,并将其值更改为 NO。无论如何,它不起作用。 (3认同)
  • 嘿@llehcram 请按照以下步骤操作:- 1. 从 Xcode 项目导航器中单击 Pods。2. 您可以看到项目附带的框架列表。3. 然后选择显示此错误的框架。4.在此框架设置下需要执行以下步骤 (3认同)
  • 你能让你的答案更具体一点吗?我们到底应该从哪里更改这个标志? (2认同)

Sim*_* I. 15

此时(Xcode 12.0 或 Xcode 12.2b2),唯一可能的解决方案是重命名 Objective-C 接口并避免冲突。这可以通过以下方式之一完成:

  • 完全重命名冲突类,更新所有使用它的地方(例如,将SessionDelegate替换为KingfisherSessionDelegate
  • @objc(...)向 Swift 类添加属性,这将更新生成...-Swift.h文件中的 Obj-C 接口并避免名称冲突。
//  SessionDelegate.swift
@objc(KFSessionDelegate)
class SessionDelegate: NSObject { ... }
Run Code Online (Sandbox Code Playgroud)
//  Kingfisher-Swift.h
@interface KFSessionDelegate : NSObject
...
@end
Run Code Online (Sandbox Code Playgroud)

此解决方案已包含在 Kingfisher 5.15.4 版本中,可以应用于任何其他库和您自己的框架。

此外,Apple 论坛上的主题:https : //developer.apple.com/forums/thread/658012