XCode 12: «SessionDelegate» имеет разные определения в разных модулях

Изменить: эта проблема возникает после XCode 12 Beta5. Xcode не позволяет разным модулям определять одинаковые имена (вероятно, для общедоступных классов и протоколов). Alamofire и Kingfisher определяют SessionDelegate одновременно. Я все еще пытаюсь найти решение..

Я внедряю виджеты iOS 14 в наше приложение. Я начал работать с XCode 12 Beta 2, и все компилировалось нормально. Когда я обновил XCode до XCode 12 Beta 6, я столкнулся со следующей ошибкой:

«SessionDelegate» имеет разные определения в разных модулях; первое отличие - определение в модуле "Kingfisher.Swift", найденное в конце класса

Я также прилагаю скриншот файла с ошибкой.

введите здесь описание изображения

Есть ли способ отредактировать файлы заголовков, чтобы они имели разные имена для SessionDelegate для Alamofire или Kingfisher? Есть ли обходной путь для преодоления этой проблемы?

Вот вещи, которые я пробовал до сих пор:

  • Я обновил Alamofire и Kingfisher до последней версии.
  • Я очистил Podfile.lock и все модули, а также производные данные.
  • Я пытался скомпилировать с помощью устаревшей системы сборки.

person Feridun Erbaş    schedule 27.08.2020    source источник
comment
Я соответственно отредактировал свой вопрос @matt   -  person Feridun Erbaş    schedule 27.08.2020
comment
Вам нужно будет пожаловаться авторам пода. В Objective C нет пространств имен, поэтому вы должны давать своим типам уникальные имена с использованием префикса. Они этого не сделали. Это было глупо, но вы ничего не можете с этим поделать. Если вы не хотите просто изменить их код, что не является очень надежным подходом, потому что обновление сотрет ваши изменения.   -  person matt    schedule 27.08.2020
comment
Из опубликованного кода видно, что Kingfisher пытался предоставить искаженное имя Swift, которое действительно обеспечивает пространство имен. Возможно, в Xcode 12 есть проблема с этим подходом. @FeridunErbaş, вам следует сообщить об этом в Kingfisher, чтобы узнать, могут ли они это исправить. Тем временем вы можете разветвить библиотеку и сделать свое собственное переименование.   -  person Jon Shier    schedule 27.08.2020
comment
@JonShier Alamofire и Kingfisher на самом деле конфликтуют. Я отправлю сообщение об ошибке обоим   -  person Feridun Erbaş    schedule 28.08.2020
comment
Этот баг будет закрыт для Alamofire, так как нам там делать нечего. В Swift есть пространство имен, поэтому нет необходимости в префиксе типа, который нужен Obj-C.   -  person Jon Shier    schedule 28.08.2020
comment
Проблема возникает, если одна из платформ является платформой ObjC. Если у вас только быстрые фреймворки - все работает нормально.   -  person Sandr    schedule 01.09.2020
comment
@SlippD.Thompson Плюс, мой второй комментарий (теперь первый), сделанный после того, как вопрос был улучшен, на самом деле является правильным ответом. Так что на самом деле нет ничего плохого в том, как прошел разговор.   -  person matt    schedule 26.11.2020


Ответы (4)


На данный момент (Xcode 12.0 или Xcode 12.2b2) единственное возможное решение — переименовать интерфейс Objective-C и избежать конфликтов. Это может быть сделано одним из:

  • Полностью переименуйте конфликтующий класс, обновите все места, где он используется (например, замените SessionDelegate на KingfisherSessionDelegate).
  • Добавьте атрибут @objc(...) в класс Swift, который обновит интерфейс Obj-C в сгенерированном файле ...-Swift.h и позволит избежать конфликта имен.
//  SessionDelegate.swift
@objc(KFSessionDelegate)
class SessionDelegate: NSObject { ... }
//  Kingfisher-Swift.h
@interface KFSessionDelegate : NSObject
...
@end

Это решение уже включено в выпуск 5.15.4 Kingfisher и может быть применяется к любым другим библиотекам и вашим собственным фреймворкам.

Кроме того, ветка на форумах Apple: https://developer.apple.com/forums/thread/658012

person Simon I.    schedule 24.09.2020

Вы можете попробовать SWIFT_INSTALL_OBJC_HEADER = NO, у меня работает

введите здесь описание изображения

person sam    schedule 17.09.2020
comment
Можете ли вы сделать свой ответ немного более конкретным? Откуда именно мы должны изменить этот флаг? - person Feridun Erbaş; 17.09.2020
comment
Перейдите в Project, Build Settings, выберите вкладку All, найдите SWIFT_INSTALL_OBJC_HEADER и измените его значение на NO. Во всяком случае, это не работает. - person Senocico Stelian; 18.09.2020
comment
Это сработало для меня, вы просто делаете этот шаг в настройках фреймворка, а не в цели вашего проекта. - person Pankaj Sonava; 07.10.2020
comment
спасибо, это сработало для меня при настройке фреймворка, хороший совет @PankajSonava - person taha; 15.10.2020
comment
@PankajSonava, эй, просто интересно, как мне это сделать в настройках фреймворка, а не в цели проекта? потому что я не могу решить эту проблему - person llehcram; 18.10.2020
comment
Привет, @llehcram, выполните следующие действия: 1. Нажмите на Pods в навигаторе проектов Xcode. 2. Там вы можете увидеть список фреймворков, которые вы прикрепили к проекту. 3. Затем вы выбираете платформу, которая показывает эту ошибку. 4. В этой настройке фреймворка вам необходимо выполнить следующие шаги. - person Pankaj Sonava; 19.10.2020

Ошибка говорит о том, что у вас есть несколько классов с одинаковым именем SessionDelegate в разных модулях. Эта ошибка связана с Xcode 12.

На данный момент быстрое решение — установить модуль с CocoaPods (если вы используете Carthage) и при необходимости переименовать интерфейс SessionDelegate.

person Senocico Stelian    schedule 18.09.2020

Если вам, ребята, нужно временное решение, вот как для пользователей Cocoapods:

  1. Клонируйте библиотеку Kingfisher на тот же уровень папки, что и ваш проект. Вы можете получить его на Github.

  2. Откройте Kingfisher.xcworkspace в XCode и переименуйте файл SessionDelegate.swift в Sources/Netowking в KingFisherSessionDelegate и соответствующим образом измените имя класса.

  3. Переименуйте использование SessionDelegate в KingfisherSessionDelegate, которое доступно только в Sources/Networking/ImageDownloader.swift, начиная с версии Kingfisher 5.15.0.

  4. Добавьте локальный путь в свой Podfile.

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

person Feridun Erbaş    schedule 18.09.2020