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 и измените быструю версию в настройках сборки.