J'ai cherché quelques publications, je pense que je ne peux pas écrire une extension sous Swift, et l'appeler depuis le code Objective-C, n'est-ce pas?
Les attributs similaires à @objc ne prennent en charge que les méthodes, la classe, les protocoles?
Vous pouvez écrire une extension Swift et l'utiliser dans le code ObjectiveC. Testé avec XCode 6.1.1.
Tout ce que vous devez faire c'est:
créez votre extension dans Swift (pas d'annotation @objc)
importer "ProjectTarget-Swift.h" dans votre classe ObjectiveC (où "ProjectTarget" représente la cible XCode à laquelle l'extension Swift est associée)
appeler les méthodes à partir de l'extension Swift
J'ai découvert que dans Swift 4. je devais ajouter @objc
devant mon mot-clé extension afin que les méthodes d’extension Swift) soient visibles par une instance de la classe Objc que j’étendais.
En bref:
Configuration de fichier:
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];
Cette solution fonctionne pour Swift 2.2 et Swift.]. Notez que seules les extensions pour les classes (pas pour les structures ou les énumérations) seront accessibles depuis Objective-C.
import UIKit
extension UIColor {
//Custom colours
class func otheEventColor() -> UIColor {
return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
}
}
Alors # import "ProductModuleName-Swift.h" dans votre fichier ObjC.
Comme indiqué dans les autres réponses, importer l'en-tête généré Swift 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 pas 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 transtyper la valeur de retour dans votre Swift avec as String
) ou définissez une extension pour les types Swift et Objective-C).
Importer "# import" ProductModuleName-Swift.h " en-tête dans le fichier objective-c et ajouter @ objc en face de votre extension dans Swift. Il fonctionnera parfaitement dans Swift 4.2 et Swift 5