2016-04-29 10 views
1

Ich schreibe ein OS X/iOS-Framework in Objective-C und möchte, dass das Framework für Entwickler nützlich ist, die entweder Objective-C oder Swift verwenden.Wie erstelle ich eine Enum für Swift und ObjC mit Standardbenennung?

In normalen Objective-C enums sind wie folgt definiert (dieses Beispiel stammt direkt aus Apple's own UIView class reference).

typedef enum { 
    UIViewAnimationCurveEaseInOut, 
    UIViewAnimationCurveEaseIn, 
    UIViewAnimationCurveEaseOut, 
    UIViewAnimationCurveLinear 
} UIViewAnimationCurve; 

Um diese Enum Swift freundlicher zu machen, ist mein Verständnis, dass es so erklärt werden sollte.

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { 
    UIViewAnimationCurve_EaseInOut, 
    UIViewAnimationCurve_EaseIn, 
    UIViewAnimationCurve_EaseOut, 
    UIViewAnimationCurve_Linear 
}; 

Dies ermöglicht es der Enum im Stil let curve: UIViewAnimationCurve = .EaseInOut von Swift zugegriffen werden.

Mein Problem ist, dass die NS_ENUM10 und Unterstreichungsmethode merkwürdig benannte Enums produziert, wenn sie von Objective-C verwendet werden. Die Methode NS_ENUM ermöglicht die Verwendung der Punktschreibweise von Swift, aber es bedeutet auch, dass jeder ObjC-Code einen Unterstrich im aufgezählten Namen verwenden muss, was unerwünscht ist.

Wie kann ich die Punktnotation für Swift zulassen und gleichzeitig Objective-C-Namenskonventionen für ObjC-Code beibehalten?

Antwort

3

Sie folgen einfach der üblichen Konvention - Unterstreichung ist nicht erforderlich. Der Swift-Compiler ist schlau genug, um einfach das gemeinsame Präfix auszuschneiden (der Teil, der dem Namen des Aufzählungstyps entspricht). Sie müssen einen NS_ENUM verwenden, damit die Enum für Swift sichtbar gemacht wird, aber es ist trotzdem eine gute Übung.

Typischer Fall, zum Beispiel UIViewAnimationCurve in nur das Formular, das Sie in Ihrem ersten Codebeispiel beschreiben in einem Objective-C-Header definiert ist, und arbeitet in Swift ganz gut:

enter image description here