Xcode 9: Mit Swift 3.1 kompiliertes Modul kann nicht in Swift 4.0 importiert werden

79

Nach dem Update auf Xcode 9 habe ich versucht, eines meiner Projekte zu erstellen.

Ich benutze den FacebookLogin Pod. Ich habe einen Compilerfehler in FacebookLogin / LoginButton.swift

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

In den Build-Einstellungen meines Ziels ist die Swift-Sprachversion auf Swift 3.2 eingestellt .

Screenshot hinzugefügt

Ich muss wohl warten, bis Facebook seinen Pod aktualisiert hat. Oder irgendein anderer Vorschlag?

Vielen Dank !

Arnaud
quelle

Antworten:

73

Aktualisieren:

Die Lösung wurde auch in Swift 5 und Xcode 11 getestet und funktioniert.

Original:

Ich möchte hinzufügen, dass Sie, wenn Sie Karthago zum Kompilieren eines Moduls in Swift 3.2 verwenden, zu einem Terminal gehen und Folgendes ausführen sollten:

sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer

Um die Xcode 9-Befehlszeilentools zu verwenden, können Sie Folgendes ausführen:

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

Dadurch wird die Bibliothek mit Ihren aktuellen Befehlszeilentools kompiliert. Es kann etwas langsam sein, aber jetzt sollte das Projekt erstellt werden.

Hinweis

Führen Sie einfach Folgendes aus, um Ihre stabilen Xcode-Befehlszeilentools wiederherzustellen und zu verwenden:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xavi.pedrals
quelle
1
Ich hatte den gleichen Fehler bei der Verwendung des Algolia-Frameworks und das Erstellen mit Karthago und dem Xcode 9-Befehlstool funktionierte einwandfrei! Danke
vmeyer
3
Arbeitete für mich mit SwiftyJson. Vielen Dank!
Leandrodemarco
2
Arbeitete für mich mit Alamofire
Pachun
Hallo @xaviPedrals, ich brauche deine Hilfe ... Ich versuche das Projekt " github.com/swiftingio/SingTest " auszuführen, erhalte aber den Fehler "Das mit Swift 3.1 kompilierte Modul kann vom Swift 4.2.1-Compiler nicht importiert werden: / Users / aliapple / Desktop / SingTestByAhtazaz / Pods / AudioKit / iOS / AudioKit.framework / Module / AudioKit.swiftmodule / arm64.swiftmodule ". Kannst du mir dabei helfen?
Ahtazaz
Hi @ Mr.Ahtazaz, das Projekt stammt von vor 2 Jahren, also wurde es wahrscheinlich in Swift 3 erstellt und kompiliert. Zuerst sollte das Projekt auf Swift 4 oder 5 aktualisiert werden, dann versuchen Sie, den Befehl carthage auszuführen carthage update NameOfTheLibrary --platform iOS --no-use-binaries, um die Bibliotheken zu aktualisieren, und Sie sollten in Ordnung sein
xavi.pedrals
26

Xcode 9 wird mit einem Swift 4-Compiler geliefert, der sowohl Swift 3.2 als auch Swift 4 versteht. Sie können sogar die beiden Versionen mischen und anpassen. Andere Versionen werden leider nicht unterstützt.

Selbst wenn Sie Ihre Sprache auf Swift 3.2 einstellen, wird der Swift 4-Compiler verwendet.

Wenn Sie Cocoapods verwenden, können Sie diese am Ende Ihrer Pod-Datei hinzufügen, um die Pods zur Verwendung von Swift 3.2 oder 4.0 zu zwingen:

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

Alternativ können Sie die Dateien aus dem Pod vorübergehend direkt in Ihr Projekt einfügen, bis FacebookLogin auf Swift 3.2 oder 4 aktualisiert wird.

Hinweis: Basierend auf Matts Feedback bearbeitet

klinger
quelle
1
Zu Ihrer Information - Dies ist etwas übermäßig aggressiv, da alle Pods auf Swift 4.0 gezwungen werden. Wenn ein Pod Swift 3-kompatibel ist, können Sie sicher auf Swift 3.2 stoßen. Das Anstoßen auf 4.0 führt höchstwahrscheinlich bei vielen Pods zu Compilerproblemen.
Matt S.
19

Vielleicht können Sie das Ziel reinigen, bevor Sie es erstellen. Es funktioniert gut für mich.

TomorJM
quelle
7
Hat bei mir nicht funktioniert und immer noch nach einer anderen Lösung gesucht.
Arnaud
11

Ich bin auf Xcode 9 Beta 3 auf dasselbe Problem gestoßen, das auf 'Alamofire' zeigte, und habe ein paar verschiedene Lösungen ausprobiert. Die einfachste, die ich gefunden habe, ist

1. CMD+SHIFT+K to clean the build
2. Restart Xcode 9 <-- make sure you do this step, that's critical. `
Xu Yin
quelle
11
Es ist 2017 und wir müssen Xcode noch neu starten, um Fehler zu beheben. Vielen Dank, Apple. Vielen Dank.
Oded Harth
10

Durch Ausführen eines "Bereinigungsordners" und Neustarten von Xcode 9 wurde der Fehler für mich behoben. Außerdem hat der Fehler die App nicht daran gehindert, auf meinem Gerät oder dem Simulator ausgeführt zu werden.

John Pavley
quelle
1
"Clean Build Folder": Um auf die Option zuzugreifen, öffnen Sie das Produktmenü und verwenden Sie die Wahltaste, um die Option Clean Build Folder anzuzeigen.
Hans
8

gehe zum xcode DerivedData-Verzeichnis, entferne dann alle darin enthaltenen Dateien und kompiliere dein Projekt neu. es funktioniert für mich.

Das Standardverzeichnis von DerivedData lautet: ~ / Library / Developer / Xcode / DerivedData.

reco
quelle
8

Wenn Sie Karthago verwenden , öffnen Sie das Terminal und;

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

Wenn Sie Pod verwenden , öffnen Sie das Terminal und;

pod update

(Auch wenn Sie nicht im Pod arbeiten, können Sie SWIFT_VERSION in der Poddatei ändern. Beispiel:

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

)

Nach;

Öffnen Sie Xcode und verwenden Sie;

Command+Option+Shift+K

Geben Sie hier die Bildbeschreibung ein

SwiftDeveloper
quelle
1
Bitte posten Sie keine identischen Antworten auf mehrere Fragen. Veröffentlichen Sie eine gute Antwort und stimmen Sie ab, um die anderen Fragen als Duplikate zu schließen. Wenn die Frage kein Duplikat ist, passen Sie Ihre Antworten auf die Frage an. Siehe meta.stackexchange.com/q/104227/311792
paper1111
@ paper1111 Ich erkläre alles in meiner Antwort und funktioniert
SwiftDeveloper
Ich benutze Karthago und dies ist die Lösung, die für mich funktioniert hat. Karthago Update "My Framework" hat es nicht geschnitten. Ich musste den gesamten Karthago-Katalog aktualisieren. Hat ewig gedauert, aber den Trick getan.
Matan Guttman
1
Diese Lösung hat auch bei mir funktioniert. Um doppelt sicher zu gehen, stellen Sie sicher, dass Sie xcode schließen und neu starten, nachdem Sie den Build-Ordner mit Befehl + Option + Umschalt + K bereinigt haben.
Torsten Ojaperv
@ SwiftDeveloper Wohin geht der config.build_settingsTeil?
Adrian
4

Für mich geht das.

1.Reinigen Sie Ihr Projekt in Xcode 8

2.Erstellen oder führen Sie Ihr Projekt in Xcode 9 aus

RayJiang
quelle
3

Ich habe das Projekt in Xcode 9 bereinigt und dann die App ausgeführt, es funktioniert.

Shan Ye
quelle
2

Ich hatte das gleiche Problem mit Xcode 9 GM und dies löste mein Problem: Entfernen Sie es aus dem Projekt und ziehen Sie es erneut in "Embedded Binaries".

Francisco Pereira
quelle
Ich hatte das Problem mit Alamofire 4.5.1 und habe alles andere auf dieser Seite über pod updateaber ohne Ergebnis ausprobiert . Am Ende fügte ich das Framework direkt zu meinem Projekt hinzu und fügte es meinen eingebetteten Binärdateien hinzu, die funktionierten
Heki
2

Bereinigungsordner bereinigen

Cmd + option + shift + K
Vineesh TP
quelle
1

ich habe

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

In meinem Projekt und import FBSDKLoginKitnach dem Reinigen des Ziels hatte ich kein Problem

Da der von Ihnen verwendete Pod schnell ist und ein Beta-Pod ist, ist es wahrscheinlich, dass Sie Probleme mit dem Swift 4-Compiler haben. Sie sollten vorerst die Objective-C-Version des Pods verwenden

Thibaut Noah
quelle
0

Wenn Sie von Pod verwenden:

  1. Im PodfileKommentar FacebookLogin Pod
  2. Pod installieren

  3. In PodfileKommentar FacebookLogin Pod
  4. Pod installieren

  5. Führen Sie Ihr Projekt erneut aus
Hamed
quelle
0

Für meinen Fall verwies der eigentliche Pod auf eine statische Zip-Datei mit vorgefertigten Binärdateien, die auf Swift 3.1 abzielen. Die einzige Lösung besteht darin, das Framework mit der Quelle von xcode 9 neu zu erstellen.

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

Johndpope
quelle
Ich habe ein ähnliches Problem mit AudioKit, auf das in Pods verwiesen wird. Ihre Lösung bezieht sich jedoch auf ein build_frameworks.sh im 'Framework'. Bitte fügen Sie weitere Details hinzu. Ich kann eine solche Datei nicht finden.
TomV
Versuchen Sie, die Poddatei auf eine neuere Version zu verweisen. Eine Version, die mit dem neuesten xcode 9 erstellt wurde - / keine Änderungen am Build-Skript erforderlich. github.com/AudioKit/AudioKit/releases
Johndpope
Danke für den Tipp. Ich musste die AudioKit-Version in Cocoapods auf die neueste Version mit build_frameworks.sh aktualisieren. Die Datei build_frameworks.sh wurde benötigt, um AudioKit zu "validieren", damit Apple die App nicht ablehnt.
TomV