Xcode 9: Модуль, скомпилированный с Swift 3.1, не может быть импортирован в Swift 4.0
После обновления до Xcode 9 я попытался создать один из моих проектов.
Я использую модуль FacebookLogin.
У меня ошибка компилятора в FacebookLogin/LoginButton.swift
@testable import FacebookCore
❌ Module compiled with Swift 3.1 cannot be imported in Swift 4.0
В настройках моей целевой сборки версия языка Swift установлена на Swift 3.2.
![Добавлена скриншот]()
Думаю, мне нужно дождаться, когда Facebook обновит свой модуль? Или любое другое предложение?
Спасибо!
Ответы
Ответ 1
Обновление:
Решение также протестировано и работает в Swift 5 и Xcode 11.
Оригинал:
Я хотел бы добавить, что если вы используете Carthage для компиляции модуля в Swift 3.2, вы должны перейти в терминал и запустить:
sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer
Чтобы использовать инструменты командной строки Xcode 9, вы можете запустить:
carthage update NameOfTheLibrary --platform iOS --no-use-binaries
Это скомпилирует библиотеку с вашими текущими инструментами командной строки, она может быть немного медленной, но теперь проект должен быть собран.
Примечание
Чтобы вернуть и использовать ваши стабильные инструменты командной строки Xcode, просто запустите:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
Ответ 2
Xcode 9 поставляется с компилятором Swift 4, который понимает как Swift 3.2, так и swift 4, он даже позволяет смешивать и сопоставлять между двумя версиями. К сожалению, другие версии не поддерживаются.
Даже если вы установите язык Swift 3.2, он использует компилятор Swift 4.
Если вы используете cocoapods, вы можете добавить это в конец вашего файла pod, чтобы заставить стручки использовать Swift 3.2 или 4.0:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.2'
end
end
end
В качестве альтернативы вы можете временно перенести файлы из модуля непосредственно в свой проект, пока FacebookLogin не будет обновлен до Swift 3.2 или 4.
Примечание. Отредактировано на основе обратной связи Мэтта
Ответ 3
Возможно, вы можете очистить цель до ее создания.
Это отлично работает для меня.
Ответ 4
Я столкнулся с той же проблемой на Xcode 9 Beta 3, которая указывала на "Alamofire" и пробовала несколько разных решений, самый простой из них -
1. CMD+SHIFT+K to clean the build
2. Restart Xcode 9 <-- make sure you do this step, that critical. `
Ответ 5
Выполнение "чистой папки сборки" и перезапуск Xcode 9 очистили ошибку для меня. Также ошибка не остановила запуск приложения на моем устройстве или симуляторе.
Ответ 6
goto xcode Каталог DerivedData, затем удалите весь файл внутри него и перекомпилируйте свой проект. это работает для меня.
и каталог DerivedData по умолчанию: ~/Library/Developer/Xcode/DerivedData.
Ответ 7
Если вы используете Carthage, Open terminal и;
carthage update --platform iOS --no-use-binaries
При использовании Pod, Open terminal и;
pod update
(Также, если вы не работаете в pod, вы можете изменить SWIFT_VERSION в podfile Ex:
config.build_settings['SWIFT_VERSION'] = '3.2'
)
После;
Откройте Xcode и используйте;
Command+Option+Shift+K
![enter image description here]()
Ответ 8
Это работает для меня.
1.Используйте свой проект в Xcode 8
2.Build или запустить проект в Xcode 9
Ответ 9
Я очистил проект в Xcode 9, а затем запустил приложение, он работает.
Ответ 10
У меня была такая же проблема с Xcode 9 GM, и это решило мою проблему:
Удалите его из проекта и перетащите его снова в "Встроенные двоичные файлы".
Ответ 11
Очистить папку сборки
Cmd + option + shift + K
Ответ 12
У меня
pod 'FBSDKCoreKit'
pod 'FBSDKLoginKit'
pod 'FBSDKShareKit'
в моем проекте и import FBSDKLoginKit
, после очистки цели у меня не было проблем
Поскольку используемый вами модуль находится в быстрой версии и является бета-модулем, вполне вероятно, что у вас возникнут проблемы с компилятором Quick 4, вы должны использовать версию objective-c модуля в настоящее время
Ответ 13
Если вы используете из Pod:
- В
Podfile
комментарий FacebookLogin pod
-
pod install
- В
Podfile
uncomment FacebookLogin pod
-
pod install
- Запустите снова проект
Ответ 14
В моем случае - фактический pod ссылался на статический почтовый индекс с предустановленными бинарниками, нацеленными на swift 3.1.
Таким образом, единственным решением является восстановление структуры с помощью источника из xcode 9.
https://github.com/AudioKit/AudioKit/issues/980
Ответ 15
Обновление для Xcode 10.2 и Swift 4.2
Стремительные 3, 4 и 4.2 цели могут сосуществовать и связываться вместе.
Вы решаете, когда и когда вы хотите перейти на целевую, когда это имеет смысл для вашего проекта. Несмотря на то, что переход на Swift 4.2 определенно поощряется, его не все-ничего-процесс, так как цели Swift 3, 4 и 4.2 могут сосуществовать и связываться друг с другом.
Различные кокоаподы и другая версия проекта также могут сосуществовать.
Вы хотите иметь другую версию cocoapod по сравнению с вашей версией проекта, после чего вы сделаете следующие изменения в конце вашего файла подкачки:
post_install do |installer|
print "Setting the default SWIFT_VERSION to 4.2\n"
installer.pods_project.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '4.2'
end
installer.pods_project.targets.each do |target|
if ['SomeTarget-iOS', 'SomeTarget-watchOS'].include? "#{target}"
print "Setting #{target} SWIFT_VERSION to 3.0\n"
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.0'
end
else
print "Setting #{target} SWIFT_VERSION to Undefined (Xcode will automatically resolve)\n"
target.build_configurations.each do |config|
config.build_settings.delete('SWIFT_VERSION')
end
end
end
end
Иногда даже после запуска обновления pod ваш xcode настоятельно обновляет вашу версию проекта cocoapod, тогда в этом случае выберите проект cocoapod pod и измените быструю версию в настройках сборки.