web-dev-qa-db-fra.com

Objective-c code peut-il appeler Swift extension sur Class?

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?

81
sprhawk

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

63
marius bardan

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];
60
Andy P.

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.

41
Foti Dim

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).

40
mclaughlinj

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

0
Ranjani