2016-05-08 10 views
16

In Xcode, per qualsiasi intestazione Objective-C, è possibile visualizzare lo Generated Interface, che mostra come viene visualizzato da Swift in interop.Genera interfaccia Swift dall'intestazione Objective-C dalla riga di comando

Vorrei generarlo dalla riga di comando . Qualche idea su come farlo?

Attività bonus: l'intestazione deve essere precompilata per prima, quindi tutti i #import devono essere già sostituiti.

+0

forse questo può aiutare? https://github.com/apple/swift/blob/master/test/IDE/print_clang_header.swift – fabb

+0

o questo? https://github.com/jpsim/SourceKitten – fabb

+0

o questo? 'export SOURCEKIT_LOGGING = 1 &&/Applicazioni/Xcode.app/Contents/MacOS/Xcode' – fabb

risposta

2

Richiamare il comando interprete :type lookup sul modulo che si sta tentando di controllare.

Supponiamo di avere un file di intestazione denominato header.h. Inseriscilo in una directory separata, in modo che l'interprete lo riconosca come un modulo. Crea anche una modulemap nella stessa directory. Chiamiamo questa directory Mod:

./ 
./Mod/ 
    /header.h 
    /module.modulemap 

Compilare il modulemap con il seguente:

module Mod { 
    header "./header.h" 
    export * 
} 

Una volta fatto, emettere un comando come questo:

echo "import Mod\n:type lookup Mod" | swift -I./Mod | tail -n+2 >| generated-interface.swift 

In alternativa, si potrebbe desiderare utilizzare un comando come questo con uguale effetto:

echo "import Mod\n:print_module Mod" | swift -deprecated-integrated-repl -I./Mod >| generated-interface.swift 

E 'così composto:

  • prima abbiamo eco lo script da eseguire: modulo di importazione e tipo-lookup esso;
  • quindi lanciamo l'interprete e inseriamo lo script in esso; l'argomento -I aiuta a trovare il nostro modulo, che è cruciale;
  • quindi abbiamo tagliato la parte "Benvenuto in Swift" con Coda
  • e scrivere il risultato in generated-interface.swift.

Durante l'esecuzione dei comandi sopra riportati, assicurarsi che la directory di lavoro sia impostata su un livello superiore rispetto alla directory Mod.

Si noti che l'output potrebbe non essere esattamente lo stesso di Xcode, ma è molto simile.


Solo per la cronaca, se si vuole produrre l'interfaccia da un file di Swift, allora è proprio questo:

swiftc -print-ast file.swift 
+0

quale versione swift usi? io uso lo stabile 3.1, e ottiene l'errore 'carattere non valido nel file sorgente' per' \ n' in entrambe le righe di comando – fabb

+1

Appena verificato con 3.1 e 4-beta - entrambi hanno funzionato bene. Assicurati che '\ n' venga espanso in una nuova riga; potrebbe essere un problema tra virgolette singole/doppie nella tua shell. –