Модуль, скомпилированный с помощью swift 3.0, нельзя импортировать в Swift 3.0.1.

87

Я обновил Xcode до 8.1 GM и теперь получаю следующую ошибку для SwiftyJSON. Другие импортированные фреймворки вроде работают. Есть ли способ заставить это работать в Swift 3, пока SwiftyJSON не обновит свою структуру? Я использовал Carthage для импорта / обновления фреймворков. Я также Use Legacy Swift language versionбезрезультатно пытался включить или выключить.

Модуль, скомпилированный с помощью Swift 3.0, невозможно импортировать в Swift 3.0.1: Modules / SwiftyJSON.swiftmodule / arm64.swiftmodule

HH887
источник

Ответы:

171

SwiftyJson загружается с помощью carthage. Предварительно скомпилированная загрузка - это Swift версии 3.0. Это заставляет компилятор жаловаться на неправильную версию. Используя следующую команду:

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

SwiftyJson (и все другие фреймворки в Carthage) будут скомпилированы локально с использованием локальной версии Swift (3.0.1), и компилятор больше не будет жаловаться.

циринисп
источник
7
Вы, вероятно, сэкономили мне час поисков. Спасибо.
djv 02
24
Добро пожаловать. Честно говоря, Carthage должен быть немного умнее и проверять быстрый номер версии.
zirinisp 02
Есть другие идеи? Потому что это не сработало для меня, хотя в моем случае у меня проблемы с распаковкой
Xernox
Это было прекрасно. Есть ли способ встроить это в Cartfileтак, чтобы я мог просто печатать, а carthage updateдругим разработчикам не нужно было знать / беспокоиться о дополнительных флагах?
Craig Otis
1
У меня была аналогичная ошибка с PromiseKit 4.0 после обновления с XCode 8.0 до XCode 8.1. У меня была ошибка EXC_BAD_ACCESS. В конце концов, PromiseKit пришлось перекомпилировать с Swift 3.0.1, и проблема была решена.
Рикардо Аньос
21

Удалите приложение chache из DerivedData и перестройте. ошибка может быть исправлена.

Путь DerivedData выглядит следующим образом:

~/Library/Developer/Xcode/DerivedData/
и-чжоу
источник
Сработало для меня, я удаляю этот фолтер, удаляю папку pod и использую «pod install». И исправлено.
Jose Pose S
Здравствуй. Это решение сработало для меня. Не могли бы вы подробно объяснить, что происходит, когда мы очищаем производные данные? Как ошибка уходит?
iPhoneDeveloper
У меня тоже сработало, спасибо.
Хася
10

Убедитесь, что вы поместили новый пакет XCode 8.1 GM в папку «Приложения». Мы столкнулись с этой проблемой, когда один из нас запускал Carthage для обновления наших зависимостей, но не заменил старое приложение XCode 8.0 в папке приложений (8.1 GM работала с рабочего стола).

Вы хотите убедиться, что когда вы запускаете в терминале следующее: xcrun swift -versionчто он возвращается Apple Swift version 3.0.1.

Клэй Гарретт
источник
У меня это сработало, спасибо! Также в терминале работала команда xcrun swift
-version
2
По-прежнему возникает та же проблема. Любые другие предложения
harsh_v
2
Эта команда сработала для меня: carthage update --platform iOS --no-use-binaries
HH887,
2
Я сделал, carthage update --platform iOS --no-use-binariesно до сих пор не работает. Я очистил свой проект и перезапустил Xcode, но по-прежнему получаю сообщение об ошибке. Что еще я могу попробовать?
Clifton Labrum
1
Я пробовал это. Он возвращаетсяApple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1) Target: x86_64-apple-macosx10.9
Клифтон Лабрам
9

XcodeДля меня сработало обновление по умолчанию на новый на терминале.

Шаг 1. Используйте следующую команду, чтобы обновить версию Xcode до последней версии в Терминале. Ссылка

sudo xcode-select -switch <path/to/>Xcode.app

Шаг 2. Теперь попробуйте команду обновления carthage.

carthage update --platform iOS
Мохаммад Заид Патан
источник
9

Просто чтобы дать последние обновления:

Carthage выпустила версию 0.20 27 февраля 2017 года.

Carthage теперь использует предварительный двоичный файл только в том случае, если доступный предварительный двоичный файл совместим .

При этом вам больше не нужно использовать: --no-use-binariesчтобы избежать несовместимой предварительной сборки.

Поэтому убедитесь, что у вас есть версия Carthage выше,0.20 и просто выполните:

carthage update --platform iOS
канекин
источник
XCode 8.3.3 После обновления Carthage до версии 0.25 и выполненных ниже действий у меня сработало обновление carthage --platform iOS --no-use-binaries
anoop4real
@ anoop4real У вас не работает без --no-use-binaries? Carthage должен уметь определять, совместим ли двоичный файл с вашей версией компилятора. Если он несовместим, он должен автоматически удалить загруженный двоичный файл и построить фреймворк локально.
kanekin
5

Как сказал @zirinisp:

  1. Вы можете использовать следующую команду:carthage update --platform iOS --no-use-binaries
  2. Используя следующую команду: xcrun swift -versionчтобы увидеть версию Swift
  3. Сделайте следующее: Xcode->preferences->locationsчтобы очистить производные данные и данные архивов, наиболее важно изменить инструменты командной строки на " Xcode 8.1"
  4. Используя следующую команду:, xcrun swift -versionвы можете увидеть, что версия swift - 3.0.1
  5. Задавать Use Legacy Swift Language Version = NO

Я надеюсь это поможет тебе

Крис
источник
1
  1. Переместите бета-версию / GM-версию, если Xcode в папку / Applications, и назовите ее Xcode-beta.

  2. Проверьте вывод:

    xcrun swift --version

при запуске этой команды в терминале ее выходные данные должны совпадать с версией Swift, которую вы хотите, чтобы приложение скомпилировало, потому что Carthage использует выходные данные этой команды для определения локальной версии Swift.

  1. Обновите версию Xcode до последней версии в терминале, выполнив следующую команду:

    sudo xcode-select -s /Applications/Xcode-beta.app/

  2. Соберите библиотеки для iOS и предотвратите загрузку Carthage существующих (но несовместимых) предварительно скомпилированных двоичных файлов, выполнив следующую команду:

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

  3. Очистить и построить

Tul
источник
0

У меня была точно такая же проблема с библиотекой XCTest_Gherkin , у меня она работала:

  1. Product-> Scheme->XCTest-Gherkin
  2. Product -> Build

Надеюсь, это поможет. Я использую Cocoapods.

Алан Стейман
источник
0

В настройках сборки Xcode убедитесь, что ваши пути поиска Framework содержат соответствующую папку сборки Carthage:

$(inherited)
$(PROJECT_DIR)/Carthage/Build/iOS
Джон Кроми
источник