J'ai écrit une bibliothèque dans Swift et je n'ai pas pu l'importer dans mon projet actuel, écrit en Objective-C.
Existe-t-il des moyens de l'importer?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
J'ai écrit une bibliothèque dans Swift et je n'ai pas pu l'importer dans mon projet actuel, écrit en Objective-C.
Existe-t-il des moyens de l'importer?
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
Réponses:
Vous devez importer TargetName-Swift.h
. Notez que c'est le nom cible - les autres réponses font l'erreur d'utiliser le nom de la classe.
Ce fichier unique est un en-tête généré automatiquement qui définit les interfaces Objective-C pour toutes les classes Swift de votre projet qui sont annotées @objc
ou héritées de NSObject
.
Considérations:
Si votre nom cible contient des espaces, remplacez-les par des traits de soulignement (par exemple, My Project
devient My_Project-Swift.h
)
Si votre cible est un framework, vous devez importer <TargetName/TargetName-Swift.h>
Assurez-vous que votre fichier Swift est membre de la cible
Instructions du site Web d'Apple:
Pour importer du code Swift dans Objective-C à partir du même framework
Sous Paramètres de génération , dans Empaquetage , assurez-vous que le paramètre Définit le module pour cette cible de structure est défini sur Oui . Importez le code Swift de cette cible de framework dans n'importe quel fichier Objective-C .m au sein de cette cible de framework en utilisant cette syntaxe et en remplaçant les noms appropriés:
#import "ProductName-Swift.h"
Révision:
Vous ne pouvez importer que "ProductName-Swift.h" dans des fichiers .m.
Les fichiers Swift de votre cible seront visibles dans les fichiers Objective-C .m contenant cette instruction d'importation.
Pour éviter les références cycliques, n'importez pas Swift dans un fichier d'en-tête Objective-C. Au lieu de cela, vous pouvez transmettre une classe Swift pour l'utiliser dans un en-tête Objective-C. Notez que vous ne pouvez pas sous-classer une classe Swift dans Objective-C.
NSObject
!!! vous ne pouvez pas simplement déclarer un class Blah
en un rien de temps et le faire fonctionner. ça doit êtreclass Blah : NSObject
Voici quoi faire:
Créer un nouveau projet dans Objective-C
Créer un nouveau .swift
fichier
Cliquez sur votre fichier de projet Xcode
Cliquez sur Build Settings
Recherchez la barre de recherche et recherchez le module Defines .
Modifiez la valeur sur Oui .
Rechercher le nom du module de produit .
Remplacez la valeur par le nom de votre projet.
Dans Délégué d'application, ajoutez les éléments suivants: #import "YourProjectName-Swift.h"
Remarque: chaque fois que vous souhaitez utiliser votre fichier Swift, vous devez importer la ligne suivante:
#import "YourProjectName-Swift.h"
Defines module
dans Build settings
à Yes
ce que les choses fixé pour moi!
YourProjectName
dans #import "YourProjectName-Swift.h"
sera le nom du projet de l'étape 8. Utile si le nom de votre projet contient des caractères spéciaux et que vous ne savez pas exactement comment vous devez le formater.
Si vous utilisez des Cocoapods et essayez d'utiliser un pod Swift dans un projet ObjC, vous pouvez simplement faire ce qui suit:
@import <FrameworkName>;
Accédez aux paramètres de génération dans votre fichier de projet et recherchez «Nom d'en-tête d'interface généré par Objective-C . La valeur de cette propriété est le nom que vous devez inclure.
Si votre propriété "Product Module Name" (celle dont dépend la propriété ci-dessus par défaut) varie selon que vous compilez pour test / debug / release / etc (comme c'est le cas dans mon cas), alors rendez cette propriété indépendante de celle variation en définissant un nom personnalisé.
L'importation d'un Swift
fichier à l'intérieur Objective-c
peut provoquer cette erreur, si elle ne fonctionne pas import
correctement.
REMARQUE: vous n'avez pas besoin d'importer des fichiers Swift en externe, il vous suffit d'importer un fichier qui prend en charge les fichiers Swift.
Lorsque vous avez créé / copié un fichier Swift dans le projet Objective-C . Il aurait créé automatiquement un en-tête de pontage.
Vérifiez Objective-C Generated Interface Header Name
à Targets -> Build Settings
.
Sur la base de ce qui précède, je vais importer KJExpandable-Swift.h
tel quel.
Le vôtre sera TargetName-Swift.h
, Où TargetName
diffère selon le nom de votre projet ou une autre cible que vous pourriez avoir ajoutée et exécutée dessus.
Comme ci-dessous mon objectif est KJExpandable
, il est doncKJExpandable-Swift.h
Premier pas:-
Sélectionnez la cible du projet -> Paramètres de construction -> Rechercher ('Définir') -> Définir la valeur de mise à jour du module Non à Oui
"Définit le module": OUI .
"Toujours intégrer des bibliothèques standard Swift": OUI .
"Installer l'en-tête de compatibilité Objective-C": OUI .
Deuxième étape:-
Ajouter une classe de fichier Swift dans le fichier Objective C ".h" comme ci-dessous
#import <UIKit/UIKit.h>
@class TestViewController(Swift File);
@interface TestViewController(Objective C File) : UIViewController
@end
Importez 'ProjectName (votre nom de projet) -Swift.h' dans le fichier Objective C ".m"
//TestViewController.m
#import "TestViewController.h"
/*import ProjectName-Swift.h file to access Swift file here*/
#import "ProjectName-Swift.h"
Il y a une mise en garde si vous importez du code Swift dans vos fichiers Objective-C dans le même cadre. Vous devez le faire en spécifiant le nom du cadre et les crochets:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
voici le paramètre de construction "Product Module Name" ( PRODUCT_NAME = MyFramework
).
Ajouter simplement #import "MyFramework-Swift.h"
ne fonctionnera pas. Si vous vérifiez le répertoire des produits créés (avant qu'un tel #import
fichier ne soit ajouté, vous avez donc eu au moins une génération réussie avec du code Swift dans la cible), vous devriez toujours voir le fichier MyFramework-Swift.h
dans le Headers
répertoire.
Si vous avez créé un projet dans Swift 4, puis ajouté des fichiers Objective-C, procédez comme suit:
@objcMembers
public class MyModel: NSObject {
var someFlag = false
func doSomething() {
print("doing something")
}
}
Référence: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/
Consultez les notes préliminaires sur Swift et Objective C dans le même projet
Vous devriez importer
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
ce n'est donc pas le nom de la classe comme vous l'avez écrit, mais le nom de votre module de produit et qui s'occupe d'importer tous les fichiers rapides, pas seulement un spécifique
Recherchez «Nom d'en-tête d'interface généré par Objective-C» dans les paramètres de construction de la cible que vous essayez de construire (disons que c'est MyApp-Swift.h
) et importez la valeur de ce paramètre ( #import "MyApp-Swift.h"
) dans le fichier source auquel vous essayez d'accéder. vos API Swift.
La valeur par défaut de ce champ est $(SWIFT_MODULE_NAME)-Swift.h
. Vous pouvez le voir si vous double-cliquez dans le champ de valeur du paramètre "Nom d'en-tête d'interface généré par Objective-C".
De plus, si vous avez des tirets dans le nom de votre module (disons que c'est le cas My-App
), $(SWIFT_MODULE_NAME)
tous les tirets seront remplacés par des traits de soulignement. Alors, vous devrez ajouter #import "My_App-Swift.h"
.
Si vous souhaitez utiliser le fichier Swift dans la classe Objective-C , à partir de Xcode 8, vous pouvez suivre les étapes ci-dessous:
Si vous avez créé le projet dans Objective-C:
Compilez-le et s'il générera une erreur de l'éditeur de liens comme: compilé avec une version plus récente du langage Swift (3.0) que les fichiers précédents (2.0) pour l'architecture x86_64 ou armv 7
Faites encore un changement dans votre
Construisez et exécutez.
Soyez prudent avec les tirets et les traits de soulignement, ils peuvent être mélangés et votre nom de projet et votre nom cible ne seront pas les mêmes que SWIFT_MODULE_NAME.
#import <TargetName-Swift.h>
vous verrez quand vous entrez à partir du clavier #import <et après automatiquement Xcode vous conseillera.
Recherchez le fichier .PCH dans le projet. puis ajoutez #import "YourProjectName-Swift.h"
Cela importera les en-têtes de classe. Pour que vous n'ayez pas à importer dans un fichier spécifique.
#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