web-dev-qa-db-fra.com

Xcode 6 / Beta 4: l'utilisation des en-têtes de pontage avec les cibles de structure n'est pas prise en charge

Je viens de passer à Xcode 6 Beta 4 et j'ai un framework que j'ai créé pour Live Views en Beta 2. En raison d'un autre Swift bug , j'avais besoin d'utiliser certains Obj Code -C. Lors de la mise à niveau cependant, j'obtiens l'erreur suivante:

erreur: l'utilisation des en-têtes de pontage avec les cibles du cadre n'est pas prise en charge

Je n'ai rien vu dans les notes de publication ni trouvé d'autre voie de migration. Est-ce que quelqu'un d'autre a vu cela et est parvenu à une solution?

Je me rends compte que la version bêta 3 a éliminé la nécessité de disposer de cadres pour les vues en direct, mais cela a du sens dans mon cas si je peux le faire fonctionner. Je peux toutefois le supprimer, mais je préférerais utiliser un cadre si elles ne sont pas totalement cassées dans la version bêta 4.

118
Chris Conover

Lorsque l'erreur indique, les en-têtes de pontage ne sont pas autorisés dans Frameworks. La section Importation de code à partir de la même cible du cadre de Mix & Match Apple Comme le dit la documentation, vous devez "Dans votre fichier d'en-tête parapluie, importez chaque en-tête Objective-C que vous souhaitez exposer à Swift".

Cependant, j’ai découvert que vous deviez peut-être aussi rendre publics ces en-têtes spécifiques. Cette réponse examine pourquoi et comment faire cela: erreur du compilateur Swift: "en-tête non modulaire dans le module de cadre" .

Alors, fais ceci:

  1. Supprimez votre fichier d'en-tête de pontage.
  2. Supprimer les références au fichier d'en-tête de pontage dans les paramètres de construction pour la structure
  3. Ajoutez les en-têtes nécessaires à votre fichier parapluie ([ProductName] .h)
  4. Rendez les fichiers inclus publics dans la section "En-têtes" du cadre de ses "Phases de construction".
  5. Nettoyer et reconstruire.

Remarque : Le "fichier d'en-tête de parapluie" est un fichier (nommé [NomProduit] .h) qui représente généralement tous les en-têtes publics d'un framework. Il s'agit généralement d'une liste d'instructions #import vers d'autres en-têtes contenues dans le cadre. Dans Xcode, si vous ouvrez UIKit.h, vous verrez un bon exemple de fichier parapluie.

207
DeepFriedTwinkie

Il y a deux possibilités. L'ajout des en-têtes nécessaires au fichier d'en-tête de parapluie et leur publication sont un moyen. Cependant, cela pose un problème si les en-têtes doivent être disponibles pour Swift, mais pas publics.

La deuxième possibilité qui rendra les en-têtes internes disponibles pour Swift est décrite en détail ici . Pour résumer, une mappe de module similaire à celle-ci doit être créée:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Ceci peut ensuite être inclus dans XCode en utilisant le paramètre:

Swift_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
22
Jan Rüegg

Voir Importer Objective-C dans Swift .

Pour importer du code Objective-C dans Swift à partir du même cadre

  1. Sous Paramètres de construction, dans Conditionnement, assurez-vous que le paramètre Définit le module pour cette cible d'infrastructure est défini sur "Oui".
  2. Dans votre fichier d'en-tête parapluie, importez chaque en-tête Objective-C que vous souhaitez exposer à Swift. Par exemple:

     #import "XYZ/XYZCustomCell.h" 
     #import "XYZ/XYZCustomView.h" 
     #import "XYZ/XYZCustomViewController.h" 
    
  3. Rendez les fichiers inclus publics dans la section "En-têtes" du cadre de ses "Phases de construction".

  4. Nettoyer et reconstruire.

Swift verra chaque en-tête que vous exposez publiquement dans votre en-tête. Le contenu des fichiers Objective-C de cette structure sera disponible automatiquement dans tout fichier Swift de cette cible de la structure, sans instruction d'importation. Utilisez votre code Objective-C personnalisé avec la même syntaxe Swift que celle utilisée avec les classes système.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Important: le "fichier d'en-tête de parapluie" désigne le fichier {NomModule} .h. Par ailleurs, le nom de la cible est {nom_module} .framework.

9
Ralph Shane