【问题标题】:XCode 12: 'SessionDelegate' has different definitions in different modulesXCode 12: 'SessionDelegate' 在不同的模块中有不同的定义
【发布时间】:2020-12-16 05:20:53
【问题描述】:

编辑: 这个问题出现在 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 进行编译

【问题讨论】:

  • 我已经相应地编辑了我的问题@matt
  • 您需要向 pod 作者投诉。 Objective C 没有命名空间,因此您应该使用前缀为您的类型赋予唯一的名称。他们没有。这很愚蠢,但 you 对此无能为力。除非您只想更改他们的代码,否则这不是一个非常可靠的方法,因为更新会清除您的更改。
  • 从发布的代码中,很明显 Kingfisher 试图提供一个错位的 Swift 名称,它确实提供了命名空间。 Xcode 12 中的这种方法可能存在问题。@FeridunErbaş 你应该向 Kingfisher 提交一个关于这个问题的错误,看看他们是否可以修复它。同时,您可以分叉库并进行自己的重命名。
  • @JonShier Alamofire 和 Kingfisher 实际上存在冲突。我会向他们俩提交一个错误
  • 该错误将为 Alamofire 关闭,因为我们在那里无事可做。 Swift 有命名空间,所以不需要 Obj-C 需要的类型前缀。

标签: swift xcode alamofire kingfisher xcode12


【解决方案1】:

当我更新 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

【讨论】:

    【解决方案2】:

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

    • 完全重命名冲突类,更新所有使用它的地方(例如,将 SessionDelegate 替换为 KingfisherSessionDelegate
    • @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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 你能把你的回答说得更具体一点吗?我们究竟应该从哪里更改此标志?
      • 转到项目,构建设置,选择所有选项卡,搜索 SWIFT_INSTALL_OBJC_HEADER,并将其值更改为 NO。无论如何,它不起作用。
      • 这对我有用,您只需在框架设置下执行此步骤,而不是在您的项目目标中
      • 谢谢,这在框架设置下对我有用,很好的提示@PankajSonava
      • 嘿@llehcram 请按照以下步骤操作:- 1. 从您的 Xcode 项目导航器中单击 Pods。 2.你可以看到你附加到项目的框架列表。 3. 然后选择显示此错误的框架。 4.在这个框架设置下你需要做这些步骤
      【解决方案4】:

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

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

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

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

      4. 在您的 Podfile

        中添加本地路径

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-10
          • 2019-03-14
          相关资源
          最近更新 更多