Xcode 9: Модуль, скомпільований із Swift 3.1, не можна імпортувати в Swift 4.0


79

Після оновлення до Xcode 9 я спробував створити один зі своїх проектів.

Я використовую FacebookLogin pod. У мене помилка компілятора у FacebookLogin / LoginButton.swift

@testable import FacebookCore
❌ Module compiled with Swift 3.1 cannot be imported in Swift 4.0

У налаштуваннях збірки моєї цілі мовною версією Swift встановлено Swift 3.2 .

Знімок екрана додано

Думаю, мені потрібно почекати, поки Facebook оновить їхній стручок? Або будь-яка інша пропозиція?

Дякую !


Ви можете спробувати народно це.
Джеррі Чжоу,

Відповіді:


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 ". Чи можете ви мені в цьому допомогти?
Ахтазаз,

Привіт @ 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
FYI - Це дещо надто агресивно, змушуючи всі стручки Swift 4.0. Якщо стручок сумісний із Swift 3, ви можете сміливо перейти до Swift 3.2. Підштовхування до 4.0 з більшою ймовірністю спричинить проблеми з компілятором для багатьох стручків.
Matt S.

19

Можливо, ви зможете очистити ціль, перш ніж будувати її. Для мене це прекрасно працює.


7
У мене не вийшло, все ще шукаю іншого рішення.
Арно

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. Дякую.
Oded Harth

10

Виконання "чистої папки збірки" та перезапуск Xcode 9 очистили помилку для мене. Крім того, помилка не зупинила роботу програми на моєму пристрої чи симуляторі.


1
"чиста папка збірки": щоб отримати доступ до опції, відкрийте меню "Продукт" і за допомогою клавіші Option відкрийте параметр "Очистити папку збірки".
Ганс,

8

goto xcode каталог DerivedData, потім видаліть увесь файл всередині нього та перекомпілюйте свій проект. це працює для мене.

а за замовчуванням каталог DerivedData: ~ / Library / Developer / Xcode / DerivedData.


8

Якщо використовується Carthage , відкрийте термінал та;

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

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


1
Будь ласка, не публікуйте однакові відповіді на кілька запитань. Опублікуйте одну хорошу відповідь, а потім проголосуйте / позначте, щоб закрити інші запитання як дублікати. Якщо питання не є дублікатом, адаптуйте відповіді на запитання. Дивіться meta.stackexchange.com/q/104227/311792
paper1111

@ paper1111 Я пояснюю все у своїй відповіді та
працюю

Я використовую картридж, і це рішення, яке працювало для мене. Carthage оновлення "My Framework" не вирізав його. Мені довелося оновити весь каталог вагонів. Взяв назавжди, але зробив трюк.
Matan Guttman

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але без результату. Врешті-решт я додав фреймворк безпосередньо до свого проекту і додав його до мого вбудованого двійкового файлу, який працював
Хекі,


1

Я маю

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

у моєму проекті, і import FBSDKLoginKitпісля очищення цілі у мене не виникло жодної проблеми

Оскільки стручок, який ви використовуєте, працює швидко і є бета-пакетом, цілком ймовірно, у вас виникнуть проблеми з компілятором swift 4, наразі вам слід скористатися цільовою версією стручка


0

Якщо ви використовуєте з Pod:

  1. У Podfileкоментарі FacebookLogin pod
  2. встановити pod

  3. У Podfileкоментарі FacebookLogin pod
  4. встановити pod

  5. Знову запустіть свій проект

0

Для мого випадку - фактичний pod посилався на статичний zip-файл із попередньо побудованими двійковими файлами, націленими на swift 3.1. Тож єдиним рішенням є відновлення фреймворку з джерелом з xcode 9.

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


У мене є подібна проблема з посиланням на AudioKit всередині модулів. Однак ваше рішення посилається на build_frameworks.sh, знайдений у "Framework". Будь ласка, додайте більше деталей. Я не можу знайти такий файл.
TomV

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

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