J'essaye de convertir une partie de ma classe Obj-C en Swift. Et certaines autres classes Obj-C utilisent toujours enum dans cette classe convertie. J'ai cherché dans les documents préliminaires et je n'ai pas pu le trouver ou peut-être l'ai-je manqué. Existe-t-il un moyen d'utiliser Swift enum dans Obj-C Class? Ou un lien vers la documentation de ce numéro?
C'est ainsi que j'ai déclaré mon énumération 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 la version Swift antérieure à 1.2. Mais selon ce blog officiel de Swift . Dans Swift 1.2 qui a été publié avec XCode 6.3, vous pouvez utiliser Swift Enum dans Objective-C en ajoutant @objc
devantenum
la source
Réponses:
À partir de la version 1.2 de Swift (Xcode 6.3), vous pouvez. Préfixez simplement la déclaration d'énumération avec
@objc
Sans vergogne tiré du blog Swift
En Objective-C, cela ressemblerait à
la source
BearBlack
,BearGrizzly
etBearPolar
!Pour développer la réponse sélectionnée ...
Il est possible de partager des énumérations 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 dot.De l' utilisation de Swift avec Cocoa et Objective-C
Objectif c
Rapide
la source
if let a = MyEnum(rawValue: 12345)
où 12345 ne fait pas partie de cette énumération, le résultat n'est pas une énumération facultative mais une énumération invalide.À partir du guide Utilisation de Swift avec Cocoa et Objective-C :
Donc, non, vous ne pouvez pas utiliser une énumération Swift dans une classe Objective-C.
la source
@objc
comme @DanielGalasko l'a souligné dans sa réponse ci-dessous !!!@obj enum MyEnum: Int
cela fonctionnera correctement sur les fichiers Objective-C comme mentionné précédemment. Si votre énumération est déclarée avec un autre type de valeur brute comme@obj enum MyOtherEnum: String
, vous ne pourrez pas l'utiliser sur les fichiers Objective-CSwift 4.1, Xcode 9.4.1:
1) Swift enum doit être préfixé par
@objc
et être deInt
type:2) Le nom Objective-C est le nom enum + le nom du cas, par exemple
CalendarPermissionAuthorized
:Et, bien sûr, n'oubliez pas d'importer votre en-tête de pont Swift en tant que dernier élément de la liste d'importation du fichier Objective-C:
la source
Si vous préférez conserver les codes ObjC tels quels, vous pouvez ajouter un fichier d'en-tête d'assistance dans votre projet:
dans le fichier d'en-tête, ajoutez ce type d'énumération:
Il peut y avoir un autre endroit dans votre fichier .m pour effectuer une modification: pour inclure le fichier d'en-tête masqué:
remplacez [YourProjectName] par le nom de votre projet. Ce fichier d'en-tête expose toutes les classes @objc définies par Swift, enums à ObjC.
Vous pouvez recevoir un message d'avertissement concernant la conversion implicite à partir du type d'énumération ... C'est OK.
En passant, vous pouvez utiliser ce fichier d'aide d'en-tête pour conserver certains codes ObjC tels que les constantes #define.
la source
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:
Bien sûr, cela ne vous donnera pas la commodité de l'auto-complétion (sauf si vous définissez des constantes supplémentaires dans l'environnement objective-c).
la source
cela pourrait aider un peu plus
Énoncé du problème : - J'ai enum dans la classe swift, à laquelle j'accède depuis d'autres classes swift, et maintenant je dois y accéder depuis ma classe objective C.
Avant d'y accéder depuis la classe objective-c: -
Modifications pour y accéder depuis la classe objective c
et ajoutez une fonction pour lui transmettre la valeur
la source
Après avoir recherché cela, j'ai continué à ne trouver que des réponses partielles, j'ai donc créé un exemple complet d'application Swift reliée à Objective C qui a des énumérations Swift utilisées par le code Objective C et des énumérations Objective C utilisées par le code Swift. C'est un projet Xcode simple que vous pouvez exécuter et expérimenter. Il a été écrit en utilisant Xcode 10.3 avec Swift 5.0
Exemple de projet
la source
enum SwAnimal
n'a pas le premier@obj
Au cas où vous essayez d'observer une énumération qui ressemble à ceci:
cette solution de contournement m'a aidé.
Classe observable:
@objc dynamic var observable: String?
créez votre instance enum comme ceci:
Classe d'observateur:
private var _enumName: EnumName?
private let _instance = ObservableClass()
créer
Alors c'est ça. Désormais, chaque fois que vous modifiez le
_enumName
dans la classe observable, une instance appropriée de la classe observable sera également immédiatement mise à jour.Il s'agit bien sûr d'une implémentation simplifiée à l'extrême, mais elle devrait vous donner une idée de la façon d'observer les propriétés incompatibles avec KVO.
la source