web-dev-qa-db-fra.com

Est-il possible d'utiliser Enum de Swift dans Obj-C?

J'essaie de convertir une partie de ma classe Obj-C en Swift. Et d'autres classes Obj-C utilisant encore enum dans cette classe convertie. J'ai fait une recherche dans les documents préliminaires et je n'ai pas réussi à le trouver ou je l'ai peut-être manqué. Est-il possible d'utiliser Swift enum dans Obj-C Class? Ou un lien vers la doc de ce numéro?

Voici comment j'ai déclaré mon enum dans mon ancien code Obj-C et mon nouveau code Swift.

mon ancien code Obj-C:

typedef NS_ENUM(NSInteger, SomeEnum)
{
    SomeEnumA,
    SomeEnumB,
    SomeEnumC
};

@interface SomeClass : NSObject

...

@end

mon nouveau code Swift:

enum SomeEnum: NSInteger
{
    case A
    case B
    case C
};

class SomeClass: NSObject
{
    ...
}

Mise à jour: À partir des réponses. Cela ne peut pas être fait dans une version plus ancienne de Swift que la 1.2. Mais selon ce fonctionnaire Swift Blog . Dans Swift 1.2 publié avec XCode 6.3, vous pouvez utiliser Swift Enum dans Objective-C en ajoutant @objc devant enum 

116
myLifeasdog

À partir de la version 1.2 de Swift (Xcode 6.3), vous le pouvez. Préfixez simplement la déclaration enum avec @objc

@objc enum Bear: Int {
    case Black, Grizzly, Polar
}

Tiré sans vergogne du Swift Blog


En Objective-C, cela ressemblerait à

Bear type = BearBlack;
switch (type) {
    case BearBlack:
    case BearGrizzly:
    case BearPolar:
       [self runLikeHell];
}
184
Daniel Galasko

Depuis le Utilisation de Swift avec Cocoa et Objective-C guide:

Une classe ou un protocole Swift doit être marqué avec l'attribut @objc à être accessible et utilisable en Objective-C. [...]

Vous aurez accès à tout ce qui est dans une classe ou un protocole qui est marqué avec l'attribut @objc tant qu'il est compatible avec Objectif c. Ceci exclut les fonctionnalités réservées à Swift, telles que celles répertoriées ici:

Génériques Tuples/Énumérations définies dans Swift/Structures définies dans Fonctions Swift/Top-level définies dans les variables Swift/Global définies dans Swift/Typealiases définis dans Variadics Swift/style Swift/Types imbriqués / Fonctions au curry

Donc, non, vous ne pouvez pas utiliser une énumération Swift dans une classe Objective-C.

31
hpique

Pour développer la réponse sélectionnée ...

Il est possible de partager des domaines de style Swift entre Swift et Objective-C en utilisant NS_ENUM().

Ils ont juste besoin d'être définis dans un contexte Objective-C en utilisant NS_ENUM() et ils sont rendus disponibles en utilisant la notation Swift.

Du Utilisation de Swift avec Cocoa et Objective-C

Swift importe sous forme d'énumération Swift toute énumération de style C marquée par la macro NS_ENUM. Cela signifie que les préfixes des noms de valeur d’énumération sont tronqués lors de leur importation dans Swift, qu’ils soient définis dans des infrastructures système ou dans du code personnalisé.

Objectif c

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
   UITableViewCellStyleDefault,
   UITableViewCellStyleValue1,
   UITableViewCellStyleValue2,
   UITableViewCellStyleSubtitle
};

Rapide

let cellStyle: UITableViewCellStyle = .Default
29
SirNod

Si vous préférez conserver les codes ObjC tels quels, vous pouvez ajouter un fichier d'en-tête d'aide dans votre projet:

Swift2Objc_Helper.h

dans le fichier d'en-tête, ajoutez ce type d'énumération:

typedef NS_ENUM(NSInteger, SomeEnum4ObjC)
{
   SomeEnumA,
   SomeEnumB
};

Il se peut qu’il existe un autre emplacement dans votre fichier .m pour apporter une modification: pour inclure le fichier d’en-tête masqué:

#import "[YourProjectName]-Swift.h"

remplacez [VotreNomProjet] par le nom de votre projet. Ce fichier d’en-tête expose toutes les classes @objc définies par Swift, et est énuméré à ObjC.

Vous pouvez recevoir un message d’avertissement sur la conversion implicite à partir du type d’énumération ... C’est OK.

En passant, vous pouvez utiliser ce fichier d'assistance d'en-tête pour conserver certains codes ObjC tels que les constantes #define.

2
David.Chu.ca

Swift 4.1, Xcode 9.4.1:

1) Swift enum doit être précédé de @objc et être de type Int:

// in .Swift file:
@objc enum CalendarPermission: Int {
    case authorized
    case denied
    case restricted
    case undetermined
}

2) Le nom d'Objective-C est un nom enum + un nom de cas, par exemple CalendarPermissionAuthorized:

// in .m file:
// point to something that returns the enum type (`CalendarPermission` here)
CalendarPermission calPermission = ...;

// use the enum values with their adjusted names
switch (calPermission) {
    case CalendarPermissionAuthorized:
    {
        // code here
        break;
    }
    case CalendarPermissionDenied:
    case CalendarPermissionRestricted:
    {
        // code here
        break;
    }
    case CalendarPermissionUndetermined:
    {
        // code here
        break;
    }
}

Et bien sûr, n'oubliez pas d'importer votre en-tête de pontage Swift en tant que dernier élément de la liste d'importation du fichier Objective-C:

#import "MyAppViewController.h"
#import "MyApp-Swift.h"
0
leanne

cela pourrait aider un peu plus

Énoncé du problème : - J'ai énuméré dans la classe Swift, auquel je suis en train d'accéder à d'autres classes Swift, et je dois maintenant y accéder depuis l'une des classes de l'objectif C.

Avant d'y accéder depuis la classe objective-c: -

enum NTCType   {
    case RETRYNOW
    case RETRYAFTER
}
 var viewType: NTCType? 

Changements pour y accéder depuis la classe Objective C

@objc  enum NTCType :Int  {
    case RETRYNOW
    case RETRYAFTER
}

et ajouter une fonction pour la transmettre à la valeur

  @objc  func setNtc(view:NTCType)  {
        self.viewType = view; // assign value to the variable
    }
0
Anurag Bhakuni

Si vous (comme moi) voulez vraiment utiliser les énumérations String, vous pouvez créer une interface spécialisée pour objective-c. Par exemple:

enum Icon: String {
    case HelpIcon
    case StarIcon
    ...
}

// Make use of string enum when available:
public func addIcon(icon: Icon) {
    ...
}

// Fall back on strings when string enum not available (objective-c):
public func addIcon(iconName:String) {
    addIcon(Icon(rawValue: iconName))
}

Bien entendu, cela ne vous donnera pas la commodité de la saisie automatique (à moins que vous ne définissiez des constantes supplémentaires dans l'environnement objective-c).

0
Lukas Kalinski