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
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
Risposte:
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 @objc
o ereditate da NSObject
.
considerazioni:
Se il tuo nome di destinazione contiene spazi, sostituiscili con caratteri di sottolineatura (ad es. My Project
Diventa 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
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 Sì . 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.
NSObject
!!! non puoi semplicemente dichiarare un class Blah
in rapido e farlo funzionare. deve essereclass Blah : NSObject
Ecco cosa fare:
Crea un nuovo progetto in Objective-C
Crea un nuovo .swift
file
Fai clic sul file del tuo progetto Xcode
Fai clic su Impostazioni build
Trova la barra di ricerca e cerca il modulo Definisci .
Cambia il valore in Sì .
Cerca il nome del modulo del prodotto .
Cambia il valore con il nome del tuo progetto.
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"
Defines module
in Build settings
in Yes
è ciò che ha risolto le cose per me!
YourProjectName
in #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.
Se stai usando Cocoapods e stai provando a usare un pod Swift in un progetto ObjC puoi semplicemente fare quanto segue:
@import <FrameworkName>;
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.
L'importazione del Swift
file all'interno Objective-c
può causare questo errore, se non funziona import
correttamente.
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 Name
a Targets -> Build Settings
.
Sulla base di quanto sopra, importerò KJExpandable-Swift.h
così com'è.
Il tuo sarà TargetName-Swift.h
, dove TargetName
differisce 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
Primo passo:-
Seleziona Target progetto -> Crea impostazione -> Cerca ('Definisci') -> Definisci il valore di aggiornamento del modulo No su Sì
"Definisce il modulo": SÌ .
"Incorpora sempre librerie standard Swift": SÌ .
"Installa intestazione compatibilità Objective-C": SÌ .
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"
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>
MyFramework
ecco 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 #import
aggiungerne uno simile , quindi hai avuto almeno una build riuscita con del codice Swift nella destinazione), dovresti comunque vedere il file MyFramework-Swift.h
nella Headers
directory.
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/
Controlla le note di pre-release su Swift e Objective C nello stesso progetto
Dovresti importare
#import "SCLAlertView-Swift.h"
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
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"
.
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:
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
Costruisci ed esegui.
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.
#import <TargetName-Swift.h>
vedrai quando accedi dalla tastiera #import <e dopo Xcode ti avviserà automaticamente.
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