Xcode 6 / Beta 4: l’utilizzo di intestazioni di bridging con obiettivi quadro non è supportato

Ho appena aggiornato a Xcode 6 Beta 4 e ho un framework che ho creato per Live Views in Beta 2. A causa di un altro bug rapido, avevo bisogno di usare un codice Obj-C. Durante l’aggiornamento però, ottengo il seguente errore:

errore: l’utilizzo di intestazioni di bridging con obiettivi quadro non è supportato

Non ho visto nulla nelle note di rilascio o trovato alcun altro percorso di migrazione. Qualcun altro ha visto questo e è arrivato a una soluzione?

Mi rendo conto che Beta 3 ha eliminato la necessità di framework per le visualizzazioni live, ma nel mio caso ha senso se riesco a farlo funzionare. Posso rimuoverlo anche se come ripiego, ma preferirei usare un framework se non sono completamente infranti in Beta 4.

Come afferma l’errore, le intestazioni di bridging non sono consentite nei Framework. Il codice di importazione all’interno della stessa struttura La sezione di destinazione della documentazione Apple di Mix & Match suggerisce questo. Come si suol dire, è necessario “Nel file di intestazione dell’ombrello, importare ogni intestazione Objective-C che si desidera esporre a Swift”.

Tuttavia, ho scoperto che potresti dover rendere pubblici anche quegli specifici header. Questa risposta esamina perché e come farlo: Errore del compilatore Swift: “intestazione non modulare nel modulo quadro” .

Quindi, fai questo:

  1. Rimuovi il tuo file di intestazione di bridging.
  2. Rimuovi i riferimenti al file di intestazione del bridging nelle impostazioni di generazione per il framework
  3. Aggiungi le intestazioni necessarie al tuo file dell’ombrello ([ProductName] .h)
  4. Rendi pubblici i file inclusi nella sezione “Intestazioni” del framework delle “Fasi di costruzione”.
  5. Pulisci e ricostruisci.

Nota : il “file di intestazione ombrello” è un file (denominato [ProductName] .h) che generalmente rappresenta tutti gli header pubblici di un framework. Solitamente si tratta solo di un elenco di istruzioni #import ad altre intestazioni contenute nel framework. In Xcode, se apri UIKit.h, vedrai un buon esempio di file ombrello.

Ci sono due possibilità. Aggiungere le intestazioni necessarie al file di intestazione dell’ombrello e renderle pubbliche è unidirezionale. Tuttavia, questo è un problema se le intestazioni dovrebbero essere disponibili per Swift, ma non pubbliche.

La seconda possibilità che renderà disponibili intestazioni interne a Swift è descritta in dettaglio qui . In sostanza, è necessario creare una mappa modulo simile alla seguente:

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

Questo può quindi essere incluso in XCode usando l’impostazione:

 SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule 

Vedi Importazione di Objective-C in Swift .

Per importare il codice Objective-C in Swift dallo stesso framework

  1. In Impostazioni di compilazione, in Packaging, assicurati che l’impostazione Definisci modulo per quell’objective quadro sia impostata su “Sì”.
  2. Nel tuo file di intestazione ombrello, importa ogni intestazione Objective-C che vuoi esporre a Swift. Per esempio:

         #import "XYZ / XYZCustomCell.h"
         #import "XYZ / XYZCustomView.h"
         #import "XYZ / XYZCustomViewController.h"
    
  3. Rendi pubblici i file inclusi nella sezione “Intestazioni” del framework delle “Fasi di costruzione”.

  4. Pulisci e ricostruisci.

Swift vedrà ogni intestazione che esponi pubblicamente nell’intestazione dell’ombrello. Il contenuto dei file Objective-C in tale framework sarà disponibile automaticamente in qualsiasi file Swift all’interno di tale target framework, senza alcuna istruzione import. Usa il tuo codice Objective-C personalizzato con la stessa syntax Swift che usi con le classi di sistema.

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

Importante: il “file dell’intestazione dell’ombrello” indica il file {ModuleName} .h. A proposito, il nome di destinazione è {ModuleName} .framework.