Come posso importare il codice Swift in Objective-C?


281

Ho scritto una libreria in Swift e non sono stato in grado di importarlo nel mio progetto attuale, scritto in Objective-C.

Ci sono modi per importarlo?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
adoro questo progetto!
SleepsOnNewspapers

Risposte:


430

Devi importare TargetName-Swift.h. Nota che è il nome target - le altre risposte commettono l'errore di usare il nome della classe.

Questo singolo file è un'intestazione generata automaticamente che definisce le interfacce Objective-C per tutte le classi Swift nel progetto che sono annotate @objco ereditate da NSObject.

considerazioni:

  • Se il tuo nome di destinazione contiene spazi, sostituiscili con caratteri di sottolineatura (ad es. My ProjectDiventa My_Project-Swift.h)

  • Se il tuo target è un framework, devi importarlo <TargetName/TargetName-Swift.h>

  • Assicurati che il tuo file Swift sia membro della destinazione


5
Si noti che se si tenta di utilizzare il nome file Swift nella propria importazione, verrà visualizzato l'errore "Previsto"; " dopo il dichiaratore di alto livello ". nel tuo file Swift dopo "import Foundation".
louielouie,

8
EDIT: Nota: affinché funzioni, DEVE essere definito un nome del modulo di progetto. Vedi: stackoverflow.com/a/24064015/2085743
Ruben Martinez Jr.

7
Vorrei solo aggiungere una nota che se il nome del tuo progetto ha uno spazio bianco o un carattere speciale, devi sostituirli con caratteri di sottolineatura, come "La mia app" sarebbe "My_App-Swift.h"
Hola Soy Edu Feliz Navidad

84
Perché è così difficile e scarsamente documentato?
Uchuugaka,

3
@lelelo No, quel file è l'opposto di questo. L'intestazione ponte è scritta dallo sviluppatore e ti consente di inserire i simboli Objective-C e C nel tuo codice Swift. Il file Target-Swift.h viene generato automaticamente e consente al codice Objective-C / C di accedere ai simboli Swift.
Bill

154

Istruzioni dal sito Web Apple:

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

In Impostazioni build , in Confezione , assicurarsi che l' impostazione Definisci modulo per quella destinazione del framework sia impostata su . Importa il codice Swift da quella destinazione del framework in qualsiasi file Objective-C all'interno della destinazione del framework usando questa sintassi e sostituendo i nomi appropriati:

#import "ProductName-Swift.h"

Revisione:

Puoi importare "ProductName-Swift.h" solo nei file .m.

I file Swift nella destinazione saranno visibili nei file .m Objective-C contenenti questa istruzione di importazione.

Per evitare riferimenti ciclici, non importare Swift in un file di intestazione Objective-C. Invece, puoi inoltrare una classe Swift per usarla in un'intestazione Objective-C. Nota che non puoi sottoclassare una classe Swift in Objective-C.

inserisci qui la descrizione dell'immagine


2
Mi ha aiutato solo l'importazione di "ProductName-Swift.h" nei file .m. L'aggiunta dello stesso nel file .pch ha dato "Impossibile trovare la dichiarazione del protocollo per 'CLLocationManagerDelegate'; intendevi dire 'NSLayoutManagerDelegate'?"
Alphonse R. Dsouza,

@Jit non lo fa direttamente, lo dice la documentazione. Il modo più semplice è creare una classe Objective-C che si traduca in un formato comprensibile per Objective-C ++. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Alejandro Iván

1
Nota che devi derivare NSObject!!! non puoi semplicemente dichiarare un class Blah in rapido e farlo funzionare. deve essereclass Blah : NSObject
David T.

Vale la pena leggere questa risposta per alcuni casi: stackoverflow.com/questions/26328034/… A seconda di ciò che si sta facendo: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

Cosa succede se si desidera importare un'estensione Swift?
Ricardo,

150

Ecco cosa fare:

  1. Crea un nuovo progetto in Objective-C

  2. Crea un nuovo .swiftfile  

    • Apparirà una finestra pop-up che chiederà "Desideri configurare un'intestazione a ponte Objective-C" .
    • Scegli .
  3. Fai clic sul file del tuo progetto Xcode

  4. Fai clic su Impostazioni build

  5. Trova la barra di ricerca e cerca il modulo Definisci .

  6. Cambia il valore in .

  7. Cerca il nome del modulo del prodotto .

  8. Cambia il valore con il nome del tuo progetto.

  9. Nel delegato dell'app, aggiungere quanto segue: #import "YourProjectName-Swift.h"


Nota: ogni volta che si desidera utilizzare il file Swift, è necessario importare la seguente riga:

#import "YourProjectName-Swift.h"


1
Cambiare il valore di Defines modulein Build settingsin Yesè ciò che ha risolto le cose per me!
Zakaria Braksa,

Il contenuto incorporato contiene Swift: SI USA anche questo
Mohit,

4
buona risposta ma i passaggi 7-8 non sono necessari in Xcode 7.3.1 e versioni successive
Sam B

Ha funzionato per me! Grazie.
itsdamslife

1
Voglio solo aggiungere che YourProjectNamein #import "YourProjectName-Swift.h"sarà il nome del progetto dal passaggio 8. Utile se il nome del tuo progetto contiene caratteri speciali e non sei sicuro di come formattare esattamente.
Chuck Boris,

40

Se stai usando Cocoapods e stai provando a usare un pod Swift in un progetto ObjC puoi semplicemente fare quanto segue:

@import <FrameworkName>;

inserisci qui la descrizione dell'immagine


1
Molte grazie! mi hai salvato la giornata.
Esha,

Funziona come un incantesimo se abbiamo installato una libreria realizzata rapidamente tramite Cocoapods. Votato !!!
NSPratik,

21

Vai a costruire le impostazioni nel tuo file di progetto e cerca "Nome intestazione interfaccia generata Objective-C . Il valore di quella proprietà è il nome che dovresti includere.

Se la proprietà "Nome modulo prodotto" (quella da cui dipende la proprietà sopra per impostazione predefinita) varia a seconda che si compili per test / debug / release / etc (come nel mio caso), quindi rendere questa proprietà indipendente da quella variazione impostando un nome personalizzato.


15

L'importazione del Swiftfile all'interno Objective-cpuò causare questo errore, se non funziona importcorrettamente.

NOTA: non è necessario importare i file Swift esternamente, è sufficiente importare un file che si occupa dei file rapidi.

Quando hai creato / copiato il file Swift all'interno del progetto Objective-C . Avrebbe creato automaticamente un'intestazione ponte.

Controlla Objective-C Generated Interface Header Namea Targets -> Build Settings.

inserisci qui la descrizione dell'immagine

Sulla base di quanto sopra, importerò KJExpandable-Swift.hcosì com'è.

Il tuo sarà TargetName-Swift.h, dove TargetNamedifferisce in base al nome del tuo progetto o ad un altro obiettivo che potresti aver aggiunto e in esecuzione su di esso.

Come sotto il mio obiettivo è KJExpandable, così èKJExpandable-Swift.h
inserisci qui la descrizione dell'immagine


12

Primo passo:-

Seleziona Target progetto -> Crea impostazione -> Cerca ('Definisci') -> Definisci il valore di aggiornamento del modulo No su

"Definisce il modulo": .

"Incorpora sempre librerie standard Swift": .

"Installa intestazione compatibilità Objective-C": .

inserisci qui la descrizione dell'immagine

Secondo passo:-

Aggiungi la classe di file Swift nel file ".h" dell'obiettivo C come di seguito

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Importa 'ProjectName (Your Project Name) -Swift.h' nel file ".m" dell'obiettivo C

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

La dichiarazione in avanti (@class) della classe è un ottimo punto! Grazie!
Philipp Otto,

10

C'è un avvertimento se stai importando il codice Swift nei tuoi file Objective-C all'interno dello stesso framework. Devi farlo specificando il nome del framework e le parentesi angolari:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkecco l'impostazione di compilazione "Nome modulo prodotto" ( PRODUCT_NAME = MyFramework).

La semplice aggiunta #import "MyFramework-Swift.h"non funzionerà. Se controlli la directory dei prodotti compilati (prima di #importaggiungerne uno simile , quindi hai avuto almeno una build riuscita con del codice Swift nella destinazione), dovresti comunque vedere il file MyFramework-Swift.hnella Headersdirectory.


8

Se hai creato un progetto in Swift 4 e hai aggiunto i file Objective-C, fallo in questo modo:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

Riferimento: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


Nel mio codice, dopo averlo aggiornato a Swift 4.2 da swift 3. Non funziona
SNarula

che errore stai ricevendo? Ho usato il codice sopra in Swift4.2 e funziona bene.
Prashant Bhayani,

D'accordo va benissimo.
Prashant Bhayani

4

Controlla le note di pre-release su Swift e Objective C nello stesso progetto

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

Dovresti importare

#import "SCLAlertView-Swift.h"

3
Mi ha mostrato questo errore: file 'SCLAlertView-Swift.h' non trovato.
Viktor Radchenko,

2
Deve essere il nome del progetto, non il nome del file - vedi la mia risposta.
Bill,

1
Grazie per il collegamento alla documentazione. È stato utile come riferimento.
louielouie,

2
Per citare dal link fornito: The name of this header is your product module name followed by adding "-Swift.h".Quindi non è il nome della classe come hai scritto, ma il nome del modulo del prodotto e che si occupa di importare tutti i file rapidi, non solo uno specifico
Chris,

4

Cerca "Nome intestazione interfaccia generata Objective-C" nelle Impostazioni di costruzione della destinazione che stai cercando di costruire (diciamo che sia MyApp-Swift.h) e importa il valore di questa impostazione ( #import "MyApp-Swift.h") nel file di origine a cui stai tentando di accedere le tue API Swift.

Il valore predefinito per questo campo è $(SWIFT_MODULE_NAME)-Swift.h . È possibile visualizzarlo se si fa doppio clic nel campo del valore dell'impostazione "Nome intestazione interfaccia generata Objective-C".

Inoltre, se hai trattini nel nome del tuo modulo (diciamo che è My-App), in $(SWIFT_MODULE_NAME)tutti i trattini verranno sostituiti con trattini bassi. Quindi dovrai aggiungere #import "My_App-Swift.h".


Meglio di quello approvato. I trattini sono andati persi 20 minuti non tornerò mai più ahah.
Roi Mulia,

3

Se si desidera utilizzare il file Swift nella classe Objective-C , quindi da Xcode 8 in poi è possibile seguire i passaggi seguenti:

Se hai creato il progetto in Objective-C:

  1. Crea un nuovo file Swift
  2. Xcode richiederà automaticamente il file Bridge-Header
  3. Generalo
  4. Importa "ProjectName-Swift.h" nel tuo controller Objective-C (importa nell'implementazione non nell'interfaccia) (se il tuo progetto ha spazio tra i nomi, usa il trattino basso "Project_Name-Swift.h")
  5. Sarai in grado di accedere alla tua classe Objective-C in Swift.

Compilalo e se genererà un errore del linker come: compilato con la versione più recente del linguaggio Swift (3.0) rispetto ai file precedenti (2.0) per l'architettura x86_64 o armv 7

Apporta un ulteriore cambiamento nel tuo

  1. Xcode -> Progetto -> Destinazione -> Impostazioni di costruzione -> Usa versione legacy di Swift Language -> Sì

Costruisci ed esegui.


1
non visualizzo questa opzione di utilizzo della versione legacy della lingua rapida
r__

1

Fai attenzione con trattini e trattini bassi, possono essere confusi e il nome del tuo progetto e il nome del bersaglio non saranno gli stessi di SWIFT_MODULE_NAME.

Trattini e trattini bassi


1
#import <TargetName-Swift.h>

vedrai quando accedi dalla tastiera #import <e dopo Xcode ti avviserà automaticamente.


-1

Trova il file .PCH all'interno del progetto. e quindi aggiungi #import "YourProjectName-Swift.h"Ciò importerà le intestazioni di classe. In questo modo non è necessario importare in file specifici.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.