J'ai cherché quelques articles, je pense que je ne peux pas écrire une extension sous swift, et l'appeler à partir du code Objective-C, non?
@objc comme les attributs ne supportent que les méthodes, la classe, les protocoles?
J'ai cherché quelques articles, je pense que je ne peux pas écrire une extension sous swift, et l'appeler à partir du code Objective-C, non?
@objc comme les attributs ne supportent que les méthodes, la classe, les protocoles?
Réponses:
Vous pouvez écrire une extension Swift et l'utiliser dans du code Objective-C. Testé avec XCode 6.1.1.
Tout ce que vous avez à faire est:
créez votre extension dans Swift (sans @objc
annotation)
#import "ProjectTarget-Swift.h"
dans votre classe Objective-C (où "ProjectTarget" représente la cible XCode à laquelle l'extension Swift est associée)
appeler les méthodes depuis l'extension Swift
Mise à jour: à
partir de @Rizwan Ahmed mentionné, vous devez ajouter une @objc
annotation:
Depuis Swift 4.0.3, l'annotation @objc est nécessaire si vous souhaitez utiliser l'extension dans les fichiers de classe Objective C.
J'ai découvert que dans Swift 4.0, je devais ajouter @objc
devant mon mot-clé d' extension pour que les méthodes d'extension Swift deviennent visibles par une instance de la classe Objc que j'étendais.
En bref:
Configuration de la configuration des fichiers:
CustomClass.h
CustomClass.m
CustomClassExtension.swift
Dans CustomClassExtension:
@objc extension CustomClass
{
func method1()
{
...
}
}
Dans mon AppDelegate.m:
self.customClass = [[CustomClass alloc] init];
[self.customClass method1];
@nonobjc
annotation.
Cette solution fonctionne pour Swift 2.2 et Swift 3 . Notez que seules les extensions pour les classes (pas pour les structs ou les enums) seront accessibles depuis Objective-C.
import UIKit
extension UIColor {
//Custom colours
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Puis # import "ProductModuleName-Swift.h" dans votre fichier ObjC.
Swift 4
extension UIColor {
// As of Swift 4.0.3, the @objc annotation is needed if you want to use the extension in Objective-C files
@objc
class func otherEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
public
c'est nécessaire? Fonctionne très bien sans public
modificateur pour moi. Supposons-nous que l'extension ne fait pas partie du même projet mais qu'elle est importée d'un autre projet?
Comme indiqué dans les autres réponses, l'importation de l'en-tête Swift généré fonctionne dans la plupart des cas .
Une exception à cela est lorsque la catégorie est définie sur un type ponté (c'est-à-dire que l'extension est définie sur String
et non NSString
). Ces catégories ne seront pas automatiquement reliées à leurs homologues Objective-C. Pour contourner ce problème, vous devrez soit utiliser le type Objective-C (et convertir la valeur de retour dans votre code Swift avec as String
), soit définir une extension pour les types Swift et Objective-C.
public extension NSString
. Si vous obtenez un identifiant non résolu ou une erreur similaire au moment de la compilation, vous pouvez reconstituer à nouveau String par exemple let sVal = self as String
, puis appeler le code nécessaire sursVal
mclaughlinj
dit, pour la classe NSString et la structure String