Xcode 9: Moduł skompilowany w Swift 3.1 nie może być importowany w Swift 4.0

79

Po aktualizacji do Xcode 9 próbowałem zbudować jeden z moich projektów.

Używam modułu FacebookLogin . Mam błąd kompilatora w FacebookLogin / LoginButton.swift

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

W ustawieniach kompilacji mojego celu wersja językowa Swift jest ustawiona na Swift 3.2 .

Dodano zrzut ekranu

Chyba muszę poczekać, aż Facebook zaktualizuje ich pod? Albo jakaś inna sugestia?

Dzięki !

Arnaud
źródło

Odpowiedzi:

73

Aktualizacja:

Rozwiązanie przetestowane również i działające w Swift 5 i Xcode 11.

Oryginalny:

Chciałbym dodać, że jeśli używasz Carthage do kompilacji modułu w Swift 3.2, powinieneś przejść do terminala i uruchomić:

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

Aby użyć narzędzi wiersza poleceń Xcode 9, możesz uruchomić:

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

Spowoduje to skompilowanie biblioteki przy użyciu aktualnych narzędzi wiersza poleceń, może to być nieco powolne, ale teraz projekt powinien zostać zbudowany.

Uwaga

Aby przywrócić i używać stabilnych narzędzi wiersza poleceń Xcode, po prostu uruchom:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
xavi.pedrals
źródło
1
Miałem ten sam błąd, używając frameworka Algolia i skompilowałem go za pomocą narzędzia do obsługi kartaginy i Xcode 9 działało dobrze! Dzięki
vmeyer
3
Pracował dla mnie przy użyciu SwiftyJson. Dzięki!
leandrodemarco
2
Pracował dla mnie przy użyciu Alamofire
pachun
Cześć @xaviPedrals, potrzebuję twojej pomocy ... Próbuję uruchomić ten projekt " github.com/swiftingio/SingTest ", ale otrzymuję ten błąd "Moduł skompilowany w Swift 3.1 nie może być zaimportowany przez kompilator Swift 4.2.1: / Users / aliapple / Desktop / SingTestByAhtazaz / Pods / AudioKit / iOS / AudioKit.framework / Modules / AudioKit.swiftmodule / arm64.swiftmodule ". Czy możesz mi w tym pomóc?
Ahtazaz
Cześć @ Panie Ahtazaz, ten projekt jest sprzed 2 lat, więc prawdopodobnie został wykonany i skompilowany w Swift 3, najpierw projekt powinien zostać zaktualizowany do Swift 4 lub 5, a następnie spróbuj uruchomić polecenie carthage, carthage update NameOfTheLibrary --platform iOS --no-use-binariesaby zaktualizować biblioteki i powinno być dobrze
xavi.pedrals
26

Xcode 9 jest dostarczany z kompilatorem Swift 4, który rozumie zarówno Swift 3.2, jak i Swift 4, umożliwia nawet mieszanie i dopasowywanie między 2 wersjami. Niestety inne wersje nie są obsługiwane.

Nawet jeśli ustawisz język na Swift 3.2, użyje on kompilatora Swift 4.

Jeśli używasz cocoapods, możesz dodać to na końcu pliku pod, aby zmusić strąki do używania Swift 3.2 lub 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

Alternatywnie, możesz tymczasowo umieścić pliki z kapsuły bezpośrednio w swoim projekcie, dopóki FacebookLogin nie zostanie zaktualizowany do Swift 3.2 lub 4.

Uwaga: zmieniono na podstawie opinii Matta

Klinger
źródło
1
Do Twojej wiadomości - jest to nieco zbyt agresywne, zmuszając wszystkie kapsułki do przełączenia w tryb Swift 4.0. Jeśli kapsuła jest zgodna ze standardem Swift 3, możesz bezpiecznie przejść do wersji Swift 3.2. Przejście do 4.0 najprawdopodobniej spowoduje problemy z kompilatorem dla wielu podów.
Matt S.,
19

Może uda ci się wyczyścić cel, zanim go zbudujesz. U mnie działa dobrze.

TomorJM
źródło
7
Nie działa dla mnie, wciąż szukam innego rozwiązania.
Arnaud,
11

Napotkałem ten sam problem na Xcode 9 Beta 3, który wskazywał na `` Alamofire '' i wypróbowałem kilka różnych rozwiązań, najłatwiejsze, które znalazłem, to

1. CMD+SHIFT+K to clean the build
2. Restart Xcode 9 <-- make sure you do this step, that's critical. `
Xu Yin
źródło
11
Jest rok 2017 i nadal musimy ponownie uruchomić Xcode, aby rozwiązać błędy. Dziękuję, Apple. Dziękuję Ci.
Oded Harth
10

Wykonanie „czystego folderu kompilacji” i ponowne uruchomienie Xcode 9 usunęło błąd. Błąd nie zatrzymał również uruchomienia aplikacji na moim urządzeniu lub symulatorze.

John Pavley
źródło
1
„czysty folder kompilacji”: Aby uzyskać dostęp do opcji, otwórz menu Produkt i użyj klawisza Opcja, aby wyświetlić opcję Wyczyść folder kompilacji.
Hans
8

goto xcode DerivedData, a następnie usuń cały plik z niego i ponownie skompiluj projekt. to działa dla mnie.

a domyślny katalog DerivedData to: ~ / Library / Developer / Xcode / DerivedData.

reco
źródło
8

Jeśli używasz Kartaginy , otwórz terminal i;

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

Jeśli używasz Pod , otwórz terminal i;

pod update

(Również jeśli nie działa w pod, możesz zmienić SWIFT_VERSION w podfile Ex:

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

)

Po;

Otwórz Xcode i użyj;

Command+Option+Shift+K

wprowadź opis obrazu tutaj

SwiftDeveloper
źródło
1
Nie publikuj identycznych odpowiedzi na wiele pytań. Opublikuj jedną dobrą odpowiedź, a następnie zagłosuj / oflaguj, aby zamknąć pozostałe pytania jako duplikaty. Jeśli pytanie nie jest powtórzeniem, dostosuj swoje odpowiedzi do pytania. Zobacz meta.stackexchange.com/q/104227/311792
paper1111
@ paper1111 Wyjaśniam wszystko w mojej odpowiedzi i działa
SwiftDeveloper
Używam kartaginy i to rozwiązanie zadziałało. aktualizacja kartaginy "My Framework" nie przerwała tego. Musiałem zaktualizować cały katalog kartaginy. Trwało to wieczność, ale udało się.
Matan Guttman
1
To rozwiązanie również działało u mnie. Aby być podwójnym, upewnij się, że zamknąłeś i ponownie uruchomiłeś xcode po wyczyszczeniu folderu kompilacji za pomocą Command + Option + Shift + K.
Torsten Ojaperv
@SwiftDeveloper Gdzie idzie config.build_settingsczęść?
Adrian,
4

Mi to pasuje.

1. Wyczyść swój projekt w Xcode 8

2. Zbuduj lub uruchom projekt w Xcode 9

RayJiang
źródło
3

Wyczyściłem projekt w Xcode 9, a następnie uruchomiłem aplikację, działa.

Shan Ye
źródło
2

Miałem ten sam problem z Xcode 9 GM i to rozwiązało mój problem: Usuń go z projektu i przeciągnij ponownie do „Osadzonych plików binarnych”.

Francisco Pereira
źródło
Miałem problem z Alamofire 4.5.1 i wypróbowałem wszystko inne na tej stronie, pod updateale bez rezultatu. W końcu dodałem framework bezpośrednio do mojego projektu i dodałem go do moich wbudowanych plików binarnych, które działały
Heki
2

Czysty folder kompilacji

Cmd + option + shift + K
Vineesh TP
źródło
1

mam

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

w moim projekcie i import FBSDKLoginKit po wyczyszczeniu celu nie miałem żadnego problemu

Ponieważ kapsuła, z której korzystasz, działa szybko i jest kapsułą beta, jest prawdopodobne, że wystąpiłyby problemy z kompilatorem Swift 4, więc na razie powinieneś używać wersji z celem

thibaut noah
źródło
0

Jeśli używasz z Pod:

  1. W Podfilekomentarzu FacebookLogin pod
  2. pod install

  3. W Podfileodkomentowaniu FacebookLogin pod
  4. pod install

  5. Uruchom ponownie swój projekt
Hamed
źródło
0

W moim przypadku - rzeczywisty pod odwoływał się do statycznego zipa z gotowymi plikami binarnymi ukierunkowanymi na Swift 3.1. Więc jedynym rozwiązaniem jest przebudowa frameworka za pomocą kodu źródłowego z xcode 9.

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

johndpope
źródło
Mam podobny problem z odwołaniami do AudioKit w podach. Jednak Twoje rozwiązanie odnosi się do pliku build_frameworks.sh znajdującego się w „Framework”. Dodaj więcej szczegółów. Nie mogę znaleźć takiego pliku.
TomV
spróbuj wskazać plik podfile do nowszej wersji. wersja, która została zbudowana z najnowszym xcode 9 - / nie potrzeba żadnych zmian w skrypcie kompilacji. github.com/AudioKit/AudioKit/releases
johndpope
Dzięki za wskazówkę. Musiałem zaktualizować wersję AudioKit w cocoapods do najnowszej, która miała build_frameworks.sh. Build_frameworks.sh był potrzebny do „walidacji” AudioKit, aby powstrzymać Apple od odrzucania aplikacji.
TomV