Xcode 8 Beta 3 Użyj problemu Legacy Swift


201

Mam projekt Objective-C w Xcode 8 Beta 3. Od czasu aktualizacji, przy każdej próbie kompilacji pojawia się następujący błąd:

„Użyj starszej wersji językowej Swift” (SWIFT_VERSION) jest poprawnie skonfigurowane dla celów korzystających z Swift. Użyj menu [Edycja> Konwertuj> Na bieżącą składnię Swift…], aby wybrać wersję Swift lub użyj edytora ustawień kompilacji, aby bezpośrednio skonfigurować ustawienia kompilacji.

Czy ktoś to spotkał? Ponieważ jest to projekt Objective-C, nie ma ustawień kompilacji do skonfigurowania Swift. Upewniłem się również, że żadna zależność projektu ani CocoaPods nie używa Swift. Jedyne rozwiązanie, jakie mam, to użycie wersji Beta 2. Jakieś pomysły, jak rozwiązać ten problem?

Powinienem również wspomnieć, że korzystam z OSX 10.12 Beta 2.


Mam również ten problem ...
rockdaswift,

Odpowiedzi:


364

Jeśli używasz CocoaPods i chcesz, aby był on naprawiany automatycznie za każdym razem, gdy to robisz pod install, możesz dodać te linie na końcu pliku Pod:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '3.0'
        end
    end
end

EDYCJA: Ten problem został już rozwiązany, jeśli używasz CocoaPods w wersji 1.1.1 lub nowszej. Nie zapomnij usunąć ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESustawienia z głównych celów projektu.


24
Jeśli na razie próbujesz użyć wersji 2.3 w swojej bazie kodu, użyj 2.3zamiast 3.0 Świetnego rozwiązania! To skutecznie sprawia, że "Use Legacy Swift Language Version"do No (lub jeśli zmienisz na 2.3to Yes). Zaletą tej opcji jest jednak to, że za każdym razem pod installustawiasz to ustawienie automatycznie! Niesamowite. Widzę, że SWIFT_VERSIONjest również ustawiony na projekty Obj-C . Zakładam, że nie ma żadnych negatywnych skutków?
Herbal7ea,

8
To świetnie, ale dość niepokojące jest to, że bez eksperta Ruby w StackOverflow tysiące i miliony projektów są SOL. Ręcznie zmieniłem ustawienie Xcode SWIFT_VERSION na 2.3 w każdym module i w projekcie Pod, używając Ustawień kompilacji i to nie działało, ale tak się stało. Oznacza ukrytą przeszkadzającą magię. Nienawidzę tego.
BaseZen

5
Dosłownie zalogowałem się, aby dać ci rekwizyty w tym zakresie
Dnaso,

1
Mam projekt Obj-C z Charts (w Swift), AfNetworking i kilkoma innymi zasobnikami Obj-C. Użyłem powyższego skryptu w pliku pod. Wszystkie błędy / ostrzeżenia związane z szybkim zniknęły, ale teraz mój projekt nie może znaleźć frameworka AFNetwoking.
ibnetariq

1
@ Mr.Bista Zatwierdzone rozwiązanie stackoverflow.com/a/38597681/2854405 umożliwia pracę z ustawień Xcode. Ale być może będziesz musiał to zrobić z każdym repozytorium Pod, które masz za każdym razem, gdy robisz pod install / update. To rozwiązanie przyspiesza działanie. Możesz także teraz zaktualizować swoją wersję Cocoapods: powinna również rozwiązać ten problem.
Tulleb

119

Właśnie znalazłem sposób, aby to naprawić.

Przejdź do ustawień kompilacji projektu lub biblioteki i ustaw atrybut Swift Compiler Version „Use Legacy Swift Language Version” z Unspecified na Yes lub NO.

wprowadź opis zdjęcia tutaj


13
Nie widzę tej opcji w moim projekcie Objective-C
Bryan,

Czy masz jakieś biblioteki projektów Swift w swoim projekcie Obj-C?
rockdaswift,

2
Jeśli używasz swift i cocoapods, powyższe polecenie w cocoapods skutecznie to robi. Jeśli nie chcesz tego zmieniać za każdym razem, pod installzalecamy użycie powyższej odpowiedzi @Tulleb.
Herbal7ea,

Teraz moim błędem jest Swift Compiler Error w klasie własnej
Eduardo Oliveros

1
Ta opcja nie jest już dostępna.
Hemang,

33

Od jakiegoś czasu ignoruję ten problem i tymczasem pracuję nad innymi rzeczami - w końcu znalazłem rozwiązanie mojego problemu.

Ponieważ mój projekt dotyczy Celu C, pomyślałem, że może jeden z kapsułów, którego używam, używa Swift, sprawdziłem każdy Kapsuła i żaden z nich nie był.

Ostateczne rozwiązanie było takie, że mój model Core Data został ustawiony do generowania kodu w Swift, mimo że ręcznie go generowałem w menu Plik> Nowy> NSManagedObjectSubclass. Wszystko, co musiałem zrobić, to zmienić go na Cel C.

zrzut ekranu


1
Jak to znalazłeś? Xcode nic o tym nie mówi. Uratowałeś mnie.
Ryan

2
Rzeczywiście, moje rozwiązanie i mój wybawca. Dzięki! Głupie, jak Apple sprawia, że ​​modele Coredata automatycznie „Swifty”, gdy cała aplikacja jest cel-c ....
Bob de Graaf

18

Ten problem jest również widoczny w Xcode-8.1. Gdy dodamy nowy cel, taki jak rozszerzenie lub widżet, a biblioteka innej firmy zostanie zintegrowana z nowym celem za pomocą kokosów. Po instalacji Pod . Możemy napotkać taki sam błąd jak powyżej.

Zmień ustawienie Używaj starszej wersji językowej w każdym ustawieniu kompilacji biblioteki na

Nie .

wprowadź opis zdjęcia tutaj


W moim przypadku ustawienie Użyj starszej wersji szybkiej wersji językowej na Tak rozwiązało problem.
Jayprakash Dubey,

Upewnij się, że dla każdego lib mającego ten problem ustawiłeś Tak lub Nie .. w moim przypadku Nie zadziałało
hanzolo

To zadziałało dla mnie. Upewnij się, że robisz to samo dla celu testowego
zizutg

@zizutg: - Musimy sprawdzić wszystkie cele. Dzięki za ponowne wskazanie.
Shrawan

9

Jeśli używasz Xcode 8 lub nowszego

  1. Przejdź do Ustawień kompilacji
  2. Znajdź użycie starszej, szybkiej wersji językowej
  3. Tak - Swift 2.3
  4. Nie - Swift 3.0 wprowadź opis zdjęcia tutaj

5

Dodaj poniższy kod na końcu pliku pod.

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0'
    end
  end
end

4

Pracuję nad projektem, który ma mieszany cel C i Swift. Wcześniej używałem Swift w wersji 2.3, a po aktualizacji do Swift 3 nie byłem w stanie zbudować projektu. Xcode narzekał na wspomniany komunikat o błędzie.

Najwyraźniej w moim pliku project.pbxproj nadal była określona nieaktualna wersja Swift. Określono szybką wersję 3.0.1:

SWIFT_VERSION = 3.0.1;

Podczas gdy miałem już zainstalowany 3.0.2:

$ xcrun swift -version
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
Target: x86_64-apple-macosx10.9

Tak, naprawiłem to, zmieniając wersję Swift w pliku project-pbxproj na:

SWIFT_VERSION = 3.0;

Wygląda na to, że specyfikator wersji poziomu łatki był zbyt szczegółowy.


4

W moim przypadku mam po prostu następujące czynności

Wybierz projekt Cel => Przejdź do ustawienia kompilacji => Wyszukaj „Swift Language Version” => podaj wartość bieżącej wersji Swift

To wszystko To naprawiło mój problem

Śledź ten obraz


4

Mam ten sam błąd. Próbowałem wyszukać „Użyj starszej wersji językowej”, ale nie znalazłem. Używam Xcode 8.3.3 Po zbyt dużym surfowaniu i obejściu znalazłem to rozwiązanie, które zadziałało dla mnie.wprowadź opis zdjęcia tutaj

Here are the steps.
1=> select your target from Xcode
2=> go to build setting
3=> search for "Swift Language Version"
4=> change it to swift 3. (or accordingly.)

3

ustaw „Użyj starszej wersji szybkiej wersji językowej” na „TAK”, jeśli używasz starej wersji swift w swoim projekcie lub dowolnej szybkiej innej firmy. „Nie”, jeśli Twój projekt został zaktualizowany do aktualnej szybkiej wersji. jeśli nie skonfigurujesz szybkiej wersji, po każdej aktualizacji i instalacji, Framework Pod musi to określić.


2

Właściwie musiałem wyszukać „Legacy Swift”, aby móc go zmienić z nieokreślonego na „Tak”. Po prostu przewinąłem w dół do sekcji opisanej powyżej, nie byłem w stanie go zmienić. Mam nadzieję, że to komuś pomoże.


2

Mój projekt napisany jest w Swift. Mam ten sam błąd z fastlane. Stało się to, że mój Xcode został automatycznie zaktualizowany, więc musiałem zaktualizować swój projekt do Swift 3.0. Mam mnóstwo błędów. Naprawianie i debugowanie zajmowało zbyt dużo czasu i w tej chwili nie było warto, więc zdecydowałem się zainstalować starszą wersję Xcode. Przywróciłem mój kod do wersji 2.3. Wtedy fastlane betajuż nie działał. Okazuje się, że musiałem ustawić Narzędzie wiersza poleceń na 7.3. wprowadź opis zdjęcia tutaj


1

Miałem ten sam problem i rozwiązałem go, wykonując następujące czynności:

W Projekcie> Ustawienia kompilacji:

Always Embed Swift Standard Libraries = $(inherited) Use Legacy Swift Language Version = YES

Następnie w moim Podfile:

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

Użycie tych trzech ustawień usunęło wszystkie ostrzeżenia i pozwoliło mi poprawnie skompilować.

Najbardziej niejasnym i faktycznie osiągniętym postępem w kompilacji była zmiana SWIFT_VERSION w Podfile z 3 na 3.0, jak sugerowano tutaj .


1

Począwszy od XCode 8, możesz używać swift 2.3, mimo że XCode 8 używa swift 3.x jako domyślnej szybkiej wersji. Aby użyć swift 2.3, po prostu włącz flagę Użyj starszej wersji językowej Swift na TAK z ustawienia kompilacji, a następnie XCode użyje Swift 2.3 dla tego celu projektu.


1

Przed wypróbowaniem skomplikowanych rozwiązań, oto podstawowa kontrola, którą musisz zrobić, jeśli jesteś nowy w Cocoapods i masz ten problem.

Może być konieczne:

  • Otwórz ponownie swój Podfile
  • Sprawdź, czy linia dla platformy nie jest komentowana za pomocą „#”. Powinien wreszcie wyglądać jak:

platform :ios, '10.1' # Put the right version and no #platform here use_frameworks! # For swift pod "MyPod" # Your mean pod :)

  • Zapisz swój Podfile, Zamknij Xcode i Uruchom pod install ponownie
  • Otwórz swój project.xcworkspace

Może to po prostu to.

Jeśli nie, możesz przejść wyżej ;-)


1

Miałem ten sam problem po aktualizacji do xcode 8.3.2, ale zniknęła opcja „Użyj starszego języka Swift”. Wygląda na to, że teraz możesz to zmienić: Wersja Swift Lang

Użyłem tej poprawki z Alamofire i innymi bibliotekami i wszystko działa dobrze.


1

Przejdź do Ustawienia kompilacji projektu dla projektu i Cel wykonaj poniżej dwóch.

ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
And
Swift Compiler - Version  = Swift 3

Zmień na najnowszy Swift 3.

Błąd rozwiązany.

Jeśli to naprawiło błąd, polub to.


1

W Xcode 9 beta. Przejdź do Ustawień projektu, Ustawień kompilacji, wyszukaj Swift Language Version. W Xcode 9 musisz określić, czy używasz Swift 3.2, czy Swift 4.


Miałem projekt w wersji 9.0b, w którym ustawienie zarówno projektu, jak i celu na Swift 4 nadal powodowało błąd, ustawienie zarówno na Swift 3.2 usunęło go, a ponowne ustawienie obu na Swift 4 jest teraz w porządku, więc można zrobić wszystko dobrze i nadal pojawia się błąd.
green_knight

1

Jeśli zmienisz ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESna NOnadal nie działa, to dlatego, że problem xcode, a nie twój problem. Wykonując następujące kroki:

1. Zmień ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESwłaściwość YESna cel ostrzegawczy

2. następnie wyświetli ostrzeżenie na lewym pasku, które zaleca zmianę na szybki 3.0

3. następnie wróć do NO. Odbuduj projekt, xcode w końcu wykryje Twoją zmianę na NO!

Problem rozwiązany w tym przypadku!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.