XCode12:'SessionDelegate'在不同的模块中有不同的定义

XCode 12: 'SessionDelegate' has different definitions in different modules

编辑: XCode12 Beta5 后出现此问题。 Xcode 不允许不同的模块定义相同的名称(可能是 public 类 和协议)。 Alamofire 和 Kingfisher 似乎同时定义了 SessionDelegate。我仍在努力寻找解决方案..

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

'SessionDelegate' has different definitions in different modules; first difference is definition in module 'Kingfisher.Swift' found end of class

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

有没有办法编辑头文件,使 Alamofire 或 Kingfisher 的 SessionDelegate 具有不同的名称?是否有解决此问题的解决方法?

以下是我迄今为止尝试过的方法:

你可以试试SWIFT_INSTALL_OBJC_HEADER = 不,对我有用

错误是说您在不同的模块中有多个同名 SessionDelegate 的 类。 此错误与 Xcode 12.

有关

目前,一个快速的解决方案是使用 CocoaPods 安装模块(如果您使用的是 Carthage),如果需要,重命名 SessionDelegate 接口。

如果你们需要一个临时解决方案,这里是 Cocoapods 用户的方法:

  1. 将 Kingfisher 库克隆到与您的项目相同的文件夹级别。您可以从 Github

    获取
  2. 在XCode中打开Kingfisher.xcworkspace并将Sources/Netowking下的SessionDelegate.swift文件重命名为KingFisherSessionDelegate并更改class 名称也相应。

  3. 将 SessionDelegate 的用法重命名为 KingfisherSessionDelegate,仅在 Sources/Networking/ImageDownloader.swift Kingfisher 版本 5.15.0

    中可用
  4. 在您的 Podfile

    中添加本地路径

    pod 'Kingfisher', :path => '../Kingfisher'

目前(Xcode12.0或Xcode12.2b2),唯一可能的解决办法是重命名Objective-C接口,避免冲突。这可以通过以下之一完成:

  • 完全重命名冲突 class,更新所有使用它的地方(例如,将 SessionDelegate 替换为 KingfisherSessionDelegate
  • @objc(...) 属性添加到 Swift class,这将更新生成的 ...-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

当我更新 podfile

中的 'SWIFT_INSTALL_OBJC_HEADER' 键时对我有效
post_install do |installer|             
 installer.pods_project.targets.each do |target| 
   target.build_configurations.each do |config|                          
     if target.name == 'Alamofire'         
         target.build_configurations.each do |config|  
           config.build_settings['SWIFT_INSTALL_OBJC_HEADER'] = 'No'                 
           end                                                        
         end                                                          
       end                                                            
     end                                                              
   end