Problème Xcode 8 Beta 3 Use Legacy Swift


201

J'ai un projet Objective-C dans Xcode 8 Beta 3. Depuis la mise à jour, chaque fois que j'essaye de construire, je reçois l'erreur suivante:

«Utiliser la version de langue héritée de Swift» (SWIFT_VERSION) doit être configuré correctement pour les cibles qui utilisent Swift. Utilisez le menu [Edition> Convertir> En syntaxe Swift actuelle…] pour choisir une version Swift ou utilisez l'éditeur des paramètres de build pour configurer directement le paramètre de build.

Quelqu'un a-t-il rencontré cela? Puisqu'il s'agit d'un projet Objective-C, il n'y a pas de paramètre de construction pour configurer Swift. J'ai également vérifié qu'aucune des dépendances du projet ou CocoaPods n'utilise Swift. La seule solution que j'ai est d'utiliser la bêta 2. Des idées sur la façon de résoudre ce problème?

Je dois également mentionner que j'utilise OSX 10.12 Beta 2.


J'ai aussi ce problème ...
rockdaswift

Réponses:


364

Si vous utilisez CocoaPods et que vous souhaitez qu'il soit corrigé automatiquement à chaque fois que vous effectuez un pod install, vous pouvez ajouter ces lignes à la fin de votre Podfile:

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

EDIT: ce problème est désormais résolu si vous utilisez CocoaPods v1.1.1 ou version ultérieure. N'oubliez pas de supprimer le ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESparamètre de vos principales cibles de projet.


24
Si vous essayez d'utiliser 2.3 dans votre base de code pour le moment, utilisez 2.3plutôt une 3.0 solution géniale! Cela fait effectivement le "Use Legacy Swift Language Version"to No (ou si vous le changez en 2.3it Yes). L'avantage de cette option est cependant chaque fois que vous pod installdéfinissez ce paramètre automatiquement! Impressionnant. Je vois SWIFT_VERSIONse prépare sur Obj-C des projets ainsi. Je suppose qu'il n'y a pas d'effets indésirables?
Herbal7ea

8
C'est génial, mais il est assez inquiétant de constater que sans un expert Ruby sur StackOverflow, des milliers et des millions de projets sont SOL. J'ai changé manuellement le paramètre Xcode SWIFT_VERSION en 2.3 dans chaque module et dans le projet Pod, en utilisant les paramètres de construction, et cela n'a pas fonctionné, mais cela a fonctionné. Ce qui signifie une magie dérangeante cachée. Je déteste ça.
BaseZen

5
Je me suis littéralement connecté juste pour vous donner des accessoires à ce sujet
Dnaso

1
J'ai un projet Obj-C avec des graphiques (en Swift), AfNetworking et quelques autres pods Obj-C. J'ai utilisé le script ci-dessus dans mon fichier pod. Toutes les erreurs / avertissements liés à Swift ont disparu, mais mon projet ne peut plus trouver le cadre AFNetwoking.
ibnetariq

1
@ Mr.Bista La solution approuvée stackoverflow.com/a/38597681/2854405 le fait fonctionner à partir des paramètres Xcode. Mais vous devrez peut-être le faire avec chaque repo Pod unique que vous avez à chaque fois que vous faites un pod install / update. Cette solution accélère les choses. Vous pouvez également mettre à jour votre version des Cocoapods maintenant: cela devrait également résoudre ce problème.
Tulleb

119

Je viens de trouver un moyen de le réparer.

Accédez aux paramètres de génération du projet ou de la bibliothèque et définissez l'attribut Swift Compiler Version "Use Legacy Swift Language Version" de Unspecified sur Yes ou NO.

entrez la description de l'image ici


13
Je ne vois pas cette option dans mon projet Objective-C
Bryan

Avez-vous des bibliothèques de projet Swift dans votre projet Obj-C?
rockdaswift

2
Si vous utilisez swift et cocoapods, la commande ci-dessus dans cocoapods le fait efficacement. Si vous ne voulez pas avoir à changer cela à chaque fois que pod installje vous recommande d'utiliser la réponse de @Tulleb ci-dessus.
Herbal7ea

Maintenant, mon erreur est Swift Compiler Error dans une auto-classe
Eduardo Oliveros

1
Cette option n'est plus disponible.
Hemang

33

J'ignore ce problème depuis un certain temps maintenant et je travaille juste sur d'autres choses en attendant - j'ai finalement trouvé la solution à mon problème.

Étant donné que mon projet est Objective-C, je pensais que l'un des pods que j'utilisais utilisait Swift, j'ai vérifié chaque pod et aucun ne l'était.

La solution finale était que mon modèle Core Data était configuré pour générer du code dans Swift même si je les avais générés manuellement dans le menu Fichier> Nouveau> NSManagedObjectSubclass. Tout ce que j'avais à faire était de le passer en Objective-C.

capture d'écran


1
Comment avez-vous trouvé cela? Xcode ne dit rien à ce sujet. Tu m'as sauvé.
Ryan

2
En effet ma solution et mon sauveur. Merci! Stupide comment Apple fait des modèles Coredata automatiquement 'Swifty' quand toute l'application est objective-c ....
Bob de Graaf

18

Ce problème est également visible dans Xcode-8.1. Lorsque nous ajoutons une nouvelle cible comme une extension ou un widget et une bibliothèque tierce est intégrée dans une nouvelle cible à l'aide de cocopodes. Après l' installation du pod . Nous pouvons faire face à la même erreur que ci-dessus.

Remplacez la version Use Legacy Swift Language dans chaque paramètre de création de bibliothèque par

Non .

entrez la description de l'image ici


Dans mon cas, le paramètre Utiliser la version de langue Swift héritée sur Oui a résolu le problème.
Jayprakash Dubey

Assurez-vous que pour chaque bibliothèque ayant ce problème, vous définissez Oui ou Non .. dans mon cas, cela n'a pas fonctionné
hanzolo

Cela a fonctionné pour moi. Assurez-vous de faire de même pour la cible de test également
zizutg

@zizutg: - Nous devons recouper toutes les cibles. Merci de pointer à nouveau.
Shrawan

9

Si vous utilisez Xcode 8 ou une version ultérieure

  1. Accédez aux paramètres de construction
  2. Rechercher une ancienne version de la langue Swift
  3. Oui - Swift 2.3
  4. Non - Swift 3.0 entrez la description de l'image ici

5

Ajoutez le code ci-dessous à la fin du podfile.

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

Je travaille sur un projet qui mélange objectif-c et code swift. J'utilisais auparavant swift version 2.3 et après la mise à niveau vers swift 3, je n'ai pas pu construire le projet. Xcode s'est plaint du message d'erreur mentionné.

Apparemment, il y avait encore une version obsolète de Swift spécifiée dans mon fichier project.pbxproj. Il y avait Swift 3.0.1 spécifié:

SWIFT_VERSION = 3.0.1;

Alors que j'avais déjà installé 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

Sooo, je l'ai corrigé en changeant la version Swift dans le fichier project-pbxproj en:

SWIFT_VERSION = 3.0;

Il semble que le spécificateur de version au niveau du correctif soit trop spécifique.


4

Dans mon cas, je viens de faire les choses suivantes

Choisissez le projet cible => Aller au paramètre de construction => Rechercher «Swift Language Version» => donner à Value la version actuelle de Swift

C'est tout Il a résolu mon problème

Suivez cette image


4

J'ai eu la même erreur. J'ai essayé de rechercher «Use Legacy Swift Language Version», mais je ne l'ai pas trouvé. J'utilise Xcode 8.3.3 Après avoir trop surfé et travaillé, j'ai trouvé cette solution, et cela a fonctionné pour moi.entrez la description de l'image ici

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

définissez «Utiliser la version de langue héritée de Swift» sur «OUI» si vous utilisez une ancienne version de swift dans votre projet ou tout tiers tiers rapide. "Non" si votre projet est mis à jour vers la version swift actuelle. si vous ne configurez pas votre version rapide, après chaque mise à jour et installation, le framework Pod doit le spécifier.


2

En fait, j'ai dû faire une recherche sur «Legacy Swift» pour pouvoir le changer de non spécifié à «Oui». Lorsque j'ai simplement fait défiler vers le bas jusqu'à la section décrite ci-dessus, je n'ai pas pu le changer. J'espère que cela aidera quelqu'un.


2

Mon projet est écrit en Swift. J'ai eu la même erreur avec fastlane. Ce qui s'est passé, c'est que mon Xcode a été mis à jour automatiquement, j'ai donc dû mettre à jour mon projet vers Swift 3.0. Vous avez une tonne d'erreurs. La correction et le débogage prenaient trop de temps et cela n'en valait pas la peine à ce moment-là, j'ai donc décidé d'installer une ancienne version de Xcode. Rendu mon code à 2.3. Alors fastlane betane fonctionnait plus. Il s'avère que j'avais besoin de définir l'outil de ligne de commande sur 7.3. entrez la description de l'image ici


1

J'avais ce même problème et je l'ai résolu en procédant comme suit:

Dans Project> Build Settings:

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

Puis dans mon Podfile:

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

L'utilisation de ces trois paramètres a supprimé tous les avertissements et m'a permis de compiler correctement.

Le plus obscur et ce qui a réellement progressé dans la compilation a été de changer la SWIFT_VERSION dans le Podfile de 3 à 3.0 comme suggéré ici .


1

À partir de XCode 8, vous pouvez utiliser swift 2.3 même si XCode 8 utilise swift 3.x comme version swift par défaut. Pour utiliser swift 2.3, il suffit d'activer l'indicateur Utiliser la version du langage Swift hérité sur OUI à partir du paramètre de construction, puis XCode utilisera Swift 2.3 pour cette cible de projet.


1

Avant d'essayer des solutions compliquées, voici une vérification de base que vous devez faire si vous êtes nouveau sur Cocoapods et que vous rencontrez ce problème.

Vous devrez peut-être:

  • Ouvrez à nouveau votre Podfile
  • Vérifiez que la ligne de la plate-forme n'est pas mise en commentaire avec un «#». Cela devrait enfin ressembler à quelque chose comme:

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

  • Enregistrez votre podfile, fermez Xcode et exécutez pod install à nouveau
  • Ouvrez votre project.xcworkspace

C'est peut-être juste ça.

Sinon, vous pouvez aller au-dessus ;-)


1

J'ai eu ce même problème après la mise à jour vers xcode 8.3.2 mais l'option "Use Legacy Swift Language" avait disparu. Cela semble être la possibilité de changer maintenant: Version Swift Lang

Utilisé ce correctif avec Alamofire et d'autres bibliothèques et tout fonctionne bien.


1

Accédez au paramètre de création de projet pour le projet et Target en dessous de deux.

ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
And
Swift Compiler - Version  = Swift 3

Passez à la dernière version Swift 3.

Erreur résolue.

Si le problème est résolu, veuillez l'aimer.


1

Dans Xcode 9 beta. Allez dans Paramètres du projet, Paramètres de construction, recherchez la version linguistique de Swift. Dans Xcode 9, vous devez spécifier si vous utilisez Swift 3.2 ou Swift 4.


J'avais un projet dans 9.0b où la définition du projet et de la cible sur Swift 4 a continué de produire l'erreur, la définition de Swift 3.2 l'a supprimée, et la remise à la fois de Swift 4 est très bien, donc on peut tout faire correctement et obtenez toujours une erreur.
green_knight

1

Si vous passez ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESà NOne fonctionne toujours pas, c'est à cause du problème de xcode, pas de votre problème. Effectuez les étapes suivantes:

1.Changez la ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESpropriété pour qu'elle soit YESsur la cible d'avertissement

2. Ensuite, il affichera un avertissement sur la barre de gauche qui vous recommande de passer à swift 3.0

3. revenez ensuite à NO. Reconstruisez le projet, le xcode détecte enfin votre modification NO!

Problème résolu dans ce cas!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.