问题描述
编辑: 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以及衍生数据
- 我尝试使用旧版构建系统 进行编译
解决方法
您可以尝试SWIFT_INSTALL_OBJC_HEADER = NO,它对我有用
,目前(Xcode 12.0或Xcode 12.2b2),唯一可能的解决方案是重命名Objective-C接口并避免冲突。可以通过以下其中一种方式完成:
- 完全重命名冲突的类,更新使用它的所有位置(例如,用 KingfisherSessionDelegate 替换 SessionDelegate )
- 将
@objc(...)
属性添加到Swift类,这将在生成的...-Swift.h
文件中更新Obj-C接口,并避免名称冲突。
// SessionDelegate.swift
@objc(KFSessionDelegate)
class SessionDelegate: NSObject { ... }
// Kingfisher-Swift.h
@interface KFSessionDelegate : NSObject
...
@end
该解决方案已包含在Kingfisher 5.15.4 release中,并且可以应用于任何其他库和您自己的框架。
此外,Apple论坛上的主题:https://developer.apple.com/forums/thread/658012
,该错误表示您在不同模块中有多个具有相同名称 SessionDelegate 的类。 此错误与Xcode 12有关。
目前,一种快速的解决方案是使用CocoaPods安装模块(如果您使用的是迦太基),并在需要时重命名 SessionDelegate 接口。
,如果你们需要一个临时解决方案,这是Cocoapods用户的方法:
-
将Kingfisher库克隆到与项目相同的文件夹级别。您可以从Github
获取它 -
在XCode中打开 Kingfisher.xcworkspace ,并将Sources / Netowking下的SessionDelegate.swift文件重命名为KingFisherSessionDelegate,并相应地更改类名。
-
将SessionDelegate的用法重命名为KingfisherSessionDelegate,该功能仅在Kingfisher版本5.15.0的Sources / Networking / ImageDownloader.swift中可用。
-
在您的 Podfile
中添加本地路径pod'Kingfisher',:path =>'../ Kingfisher'