Xcode 9: модуль, скомпилированный с помощью Swift 3.1, не может быть импортирован в Swift 4.0


79

После обновления до 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 обновит свой модуль? Или любое другое предложение?

Благодаря !


Вы можете попробовать это сделать.
JerryZhou

Ответы:


73

Обновить:

Решение также протестировано и работает в 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

1
У меня была такая же ошибка с использованием фреймворка Algolia, и я построил его с помощью carthage, и командный инструмент Xcode 9 работал нормально! Спасибо
vmeyer

3
У меня работал с использованием SwiftyJson. Благодаря!
leandrodemarco

2
Работал для меня с помощью Alamofire
pachun

Привет, @xaviPedrals, мне нужна твоя помощь ... Я пытаюсь запустить этот проект " github.com/swiftingio/SingTest ", но получаю эту ошибку "Модуль, скомпилированный с помощью Swift 3.1, не может быть импортирован компилятором Swift 4.2.1: / Users / aliapple / Desktop / SingTestByAhtazaz / Pods / AudioKit / iOS / AudioKit.framework / Modules / AudioKit.swiftmodule / arm64.swiftmodule ". Вы можете мне в этом помочь?
Ahtazaz

Привет @ Mr.Ahtazaz, этот проект был создан 2 года назад, поэтому, вероятно, он был создан и скомпилирован в Swift 3, сначала проект должен быть обновлен до Swift 4 или 5, затем попробуйте запустить команду carthage carthage update NameOfTheLibrary --platform iOS --no-use-binariesдля обновления библиотек, и все должно быть в порядке
xavi.pedrals

26

Xcode 9 поставляется с компилятором Swift 4, который понимает как Swift 3.2, так и swift 4, он даже позволяет вам смешивать и сопоставлять две версии. К сожалению, другие версии не поддерживаются.

Даже если вы установите язык Swift 3.2, он будет использовать компилятор Swift 4.

Если вы используете cocoapods, вы можете добавить это в конец файла модуля, чтобы модули использовали 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.

Примечание: отредактировано на основе отзыва Мэтта.


1
К вашему сведению - это несколько чрезмерно агрессивно, заставляя все поды использовать Swift 4.0. Если модуль совместим с Swift 3, вы можете смело перейти на Swift 3.2. Переход на 4.0 более чем вероятно вызовет проблемы с компилятором для многих модулей.
Мэтт С.

19

Может быть, вы сможете очистить цель перед тем, как строить ее. Он отлично работает для меня.


7
У меня не получилось, все еще ищу другое решение.
Arnaud

11

Я столкнулся с той же проблемой в Xcode 9 Beta 3, которая указывает на «Alamofire», и попробовал несколько разных решений, самое простое, что я нашел, -

1. CMD+SHIFT+K to clean the build
2. Restart Xcode 9 <-- make sure you do this step, that's critical. `

11
Сейчас 2017 год, и нам все еще нужно перезапустить Xcode, чтобы устранить ошибки. Спасибо, Apple. Спасибо.
Одед Харт

10

Выполнение «чистой папки сборки» и перезапуск Xcode 9 устранили ошибку для меня. Также ошибка не остановила запуск приложения на моем устройстве или симуляторе.


1
«Чистая папка сборки»: чтобы получить доступ к этой опции, откройте меню «Продукт» и используйте клавишу Option, чтобы отобразить опцию «Чистая папка сборки».
Ганс

8

goto xcode DerivedData, затем удалите все файлы внутри него и перекомпилируйте свой проект. это работает для меня.

а каталог DerivedData по умолчанию: ~ / Library / Developer / Xcode / DerivedData.


8

Если вы используете Carthage , откройте терминал и;

carthage update --platform iOS --no-use-binaries

При использовании Pod откройте терминал и;

pod update

(Также, если не работает в модуле, вы можете изменить SWIFT_VERSION в подфиле Ex:

config.build_settings['SWIFT_VERSION'] = '3.2'

)

После;

Откройте Xcode и используйте;

Command+Option+Shift+K

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


1
Пожалуйста, не публикуйте одинаковые ответы на несколько вопросов. Разместите один хороший ответ, затем проголосуйте / отметьте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не повторяется, адаптируйте свои ответы к вопросу. См. Meta.stackexchange.com/q/104227/311792
paper1111,

@ paper1111 Я все объясняю в своем ответе и
работаю

Я использую Carthage, и это решение, которое мне помогло. Обновление carthage "My Framework" его не вырезало. Пришлось обновить весь каталог Carthage. Принял навсегда, но добился цели.
Матан Гуттман,

1
Это решение также сработало для меня. Чтобы быть уверенным вдвойне, убедитесь, что вы закрыли и перезапустили xcode после очистки папки сборки с помощью Command + Option + Shift + K.
Торстен Ояперв

@SwiftDeveloper Куда config.build_settingsуходит порция?
Адриан

4

Меня устраивает.

1. Очистите свой проект в Xcode 8

2.Создайте или запустите свой проект в Xcode 9


3

Я очистил проект в Xcode 9, а затем запустил приложение, оно работает.


2

У меня была такая же проблема с Xcode 9 GM, и это решило мою проблему: удалите его из проекта и снова перетащите во «Встроенные двоичные файлы».


У меня была проблема с Alamofire 4.5.1, и я пробовал все остальное на этой странице, pod updateно безрезультатно. В конце концов , я добавил рамки непосредственно в мой проект и добавить его в мой Embedded Binaries , которые работали
HEKI


1

я имею

pod 'FBSDKCoreKit'
pod 'FBSDKLoginKit'
pod 'FBSDKShareKit'

в моем проекте, и import FBSDKLoginKitпосле очистки цели у меня не было проблем

Поскольку модуль, который вы используете, находится в быстром темпе и является бета-модулем, вполне вероятно, что у вас возникнут проблемы с компилятором swift 4, вы должны пока использовать версию модуля objective-c


0

Если вы используете из Pod:

  1. В Podfileкомментарии FacebookLogin pod
  2. установка стручка

  3. В Podfileраскомментируйте FacebookLogin стручка
  4. установка стручка

  5. Запустите снова свой проект

0

В моем случае фактический модуль ссылался на статический zip-архив с предварительно созданными двоичными файлами, ориентированными на Swift 3.1. Поэтому единственное решение - перестроить фреймворк с исходным кодом из xcode 9.

https://github.com/AudioKit/AudioKit/issues/980


У меня аналогичная проблема со ссылкой на AudioKit внутри модулей. Однако ваше решение относится к build_frameworks.sh, находящемуся в «Framework». Добавьте дополнительные сведения. Я не могу найти такой файл.
TomV 02

попробуйте указать в подфайле более новую версию. версия, созданная с использованием последней версии xcode 9 - / никаких изменений скрипта сборки не требуется. github.com/AudioKit/AudioKit/releases
johndpope

Спасибо за совет. Мне пришлось обновить версию AudioKit в cocoapods до последней версии, в которой был build_frameworks.sh. Build_frameworks.sh был необходим для «проверки» AudioKit, чтобы Apple не отклоняла приложение.
TomV 04
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.