web-dev-qa-db-fra.com

Problèmes de mise en évidence de la syntaxe et de complétion de code Xcode 7.3 avec Swift

J'ai un problème extrêmement frustrant avec XCode 7.3 (cependant, ce problème persiste depuis que j'ai installé XCode 7.2) et Swift code, et j'espère que d'autres ont eu ce problème et savent comment le résoudre La mise en évidence de la syntaxe et l'achèvement du code fonctionnent parfaitement dans les fichiers Objective-C, et fonctionnent également correctement lors de l'appel d'autres objets Swift dans Swift. Cependant, tout Les objets ou méthodes Objective-C mentionnés dans Swift n'obtient pas de coloration syntaxique, et XCode ne complétera AUCUNE méthode ou propriété déclarée Objective-C. Tout se compile et fonctionne très bien.

Je dois également ajouter que j'ai également essayé de faire une installation complètement propre de XCode. J'ai supprimé toutes mes données dérivées, supprimé tous les caches XCode et supprimé mes fichiers de préférences XCode (en plus de supprimer évidemment l'archive XCode.app avant de réinstaller).

Cela rend extrêmement difficile le développement de Swift. Je ne veux pas faire cela, mais si je ne trouve pas de moyen de résoudre ce problème, je serai obligé de recommencer à utiliser Objective-C.

37
aeskreis

Il semble donc que le problème était avec CocoaPods. J'utilisais Cocoapods comme une bibliothèque statique plutôt que comme des frameworks. Passage aux frameworks (en utilisant use_frameworks! dans mon Podfile) et l'importation des bibliothèques dans Swift a résolu tous mes problèmes. Je suppose que tous ces en-têtes de bibliothèque tiers étaient trop pour le traitement de XCode. De toute façon, le problème est maintenant résolu. J'espère que cela aidera quelqu'un à l'avenir.

8
aeskreis

J'ai le même problème. Mais finalement résolu. Je fais deux changements, je ne sais pas quel est le point clé, mais vous pouvez tous les essayer.

  1. supprimer le cache du module

Dans le même dossier que les données dérivées de votre projet se trouve un cache de module. Lorsque la complétion de code a cessé de fonctionner, sa suppression l'a corrigé.

Fermer Xcode et supprimez le répertoire ~/Library/Developer/Xcode/DerivedData/ModuleCache.

  1. modifier la valeur Activer les modules

Allez dans Paramètres de construction de votre cible, puis recherchez Activer les modules

Si c'est Oui, changez-le en Non, et vous pouvez obtenir une erreur de construction, changez-le simplement en Oui.

Après deux étapes ci-dessus, vous devez Nettoyer (Maj + Commande + K) votre projet.

Pour l'instant, vous pouvez résoudre le problème.

21
Galvin

Cela pourrait ne plus être nécessaire, mais je veux toujours publier ceci:

Au moment de ce billet, la version la plus récente des cocoapods (1.0.0.beta.8) vous oblige à définir des pods pour chaque cible Xcode.

Dans mon cas, j'avais une compilation de classe pour la cible du projet et pour une cible de test. J'ai ajouté un pod uniquement à la cible principale, à cause de la paresse.

Maintenant, je travaille dans le code de la classe A J'ai ajouté le framework pod en utilisant import NAME et a essayé d'utiliser les classes du framework. Xcode ne mettrait pas en évidence le code particulier où j'utilise les nouvelles classes, mais la compilation et l'exécution fonctionnent très bien. Dans la boîte de dialogue de fin, le type de la variable était <<error type>>

La façon de résoudre ce problème: dans le Podfile ajoutez le pod nouvellement ajouté à toutes les cibles, la classe A est membre de.

Maintenant, Xcode trouve les cadres nécessaires pour toutes les cibles et la mise en évidence du code fonctionne à nouveau.

MODIFIER 1:

Une solution possible consiste à définir une liste de pods partagés, comme dans mon exemple:

platform :ios, '8.4'
use_frameworks!
inhibit_all_warnings!

def all_pods
    pod 'MPMessagePack'
    pod 'SwiftyDispatch'
    pod 'BFKit'
    pod 'Timepiece'
    pod 'Alamofire'
    pod 'AlamofireSwiftyJSON'
end

def testing_pods
    pod 'Quick'
    pod 'Nimble'
end

target 'App' do
    all_pods
end

target 'AppLogicTests' do
    all_pods
    testing_pods
end

target 'AppUITests' do
    pod 'RxTest'
    all_pods
    testing_pods
end

post_install do |installer|
    installer.pods_project.targets.each do |target|
        puts target.name
    end
end

Cela ajoutera tous les pods à toutes les cibles et ajoutera tous les pods de test aux cibles. À côté de ceux-ci, j'ai ajouté "RxTest" aux AppUITests.

(Les pods choisis sont des exemples de mes projets, aucune publicité n'est prévue :-))

6

Nous avons eu le même problème dans un projet mixte ObjC/Swift. J'ai essayé toutes les suggestions sur la suppression de données dérivées, etc., en vain. Parfois, cela a aidé, mais pas de manière reproductible et après un certain temps, il a cessé de fonctionner. Le post de Galvin dans ce post m'a mis sur la piste des paramètres de construction liés au module. Cependant, c'est un autre paramètre qui a résolu la complétion/coloration du code de manière reproductible: définir DEFINES_MODULE (sous Packaging) de YES à NO pour notre projet principal était la solution.

Remarques:

3
Marius

Si aucun des éléments ci-dessus n'a fonctionné pour vous et que vous utilisez des Cocoapods, vous pouvez essayer de passer à Carthage.

J'ai essayé toutes les suggestions que j'ai pu trouver sur Google en vain. Mais systématiquement, les Cocoapods semblaient apparaître comme une raison pour laquelle de nombreux hacks tentaient de le réparer. J'ai lu sur Carthage, et comment cela ne modifie pas votre projet, ne vous force pas à utiliser un espace de travail, ou potentiellement remplir votre dossier de construction avec des fichiers d'en-tête (ce qui confond Xcode et peut provoquer la surbrillance de la syntaxe et la saisie semi-automatique).

Après avoir effectué le changement, je n'ai rencontré aucun problème pour le moment, et pour être honnête, je préfère le petit supplément de frais généraux pour avoir une solution propre. Cet article l'a vraiment ramené chez moi.

0
Scott Fister