Можно ли использовать перечисление Swift в Obj-C?
Я пытаюсь преобразовать некоторые из моих Obj-C класса в Swift. И некоторые другие классы Obj-C все еще используют enum в этом преобразованном классе. Я искал в предрелизных документах и не мог найти его или, может быть, я пропустил его. Есть ли способ использовать Swift enum в классе Obj-C? Или ссылка на документ этого вопроса?
вот как я объявил свое перечисление в моем старом коде Obj-C и новом Swift-коде.
мой старый код Obj-C:
typedef NS_ENUM(NSInteger, SomeEnum)
{
SomeEnumA,
SomeEnumB,
SomeEnumC
};
@interface SomeClass : NSObject
...
@end
мой новый Swift Код:
enum SomeEnum: NSInteger
{
case A
case B
case C
};
class SomeClass: NSObject
{
...
}
обновление: из ответов. Это не может быть сделано в Swift более старой версии, чем 1.2. Но по словам этого чиновника Swift Blog. В Swift 1.2, выпущенном вместе с XCode 6.3, вы можете использовать Swift Enum в Objective-C, добавив @objc перед enum
6 ответов:
начиная с Swift версии 1.2 (Xcode 6.3) вы можете. Просто префикс перечисления объявление с
@objc@objc enum Bear: Int { case Black, Grizzly, Polar }бесстыдно взяты из Swift Blog
в Objective-C это будет выглядеть как
Bear type = BearBlack; switch (type) { case BearBlack: case BearGrizzly: case BearPolar: [self runLikeHell]; }
с использование Swift с какао и Objective-C руководство:
класс или протокол Swift должен быть помечен атрибутом @objc to быть доступным и пригодным для использования в Objective-C. [...]
У вас будет доступ ко всему, что находится в классе или протоколе помечается атрибутом @objc, если он совместим с Цель-C. Это исключает только функции Swift, такие как перечисленные здесь:
Дженерики Кортежей / перечисления, определенные в Swift / структуры, определенные в Swift / функции верхнего уровня, определенные в Swift / глобальные переменные, определенные в Свифт / Typealiases определенными в Swift / Свифт-стиль в / вложенные типы / Карри функции
итак, нет, вы не можете использовать быстрое перечисление в классе Objective-C.
чтобы развернуть выбранный ответ...
можно разделить SWIFT перечисления стиля между Swift и Objective-C помощью
NS_ENUM().они просто должны быть определены в контексте Objective-C с помощью
NS_ENUM()и они становятся доступными с помощью быстрой точечной нотации.С использование Swift с какао и Objective-C
Swift импортирует как Swift перечисление любое перечисление C-стиля, отмеченное
NS_ENUMмакрос. Это означает, что префиксы к именам значений перечисления усекаются при импорте в Swift, независимо от того, определены ли они в системных фреймворках или в пользовательском коде.С
typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle };Свифт
let cellStyle: UITableViewCellStyle = .Default
Если вы предпочитаете хранить коды ObjC как есть, вы можете добавить файл заголовка помощника в свой проект:
Swift2Objc_Helper.hв заголовочном файле добавьте этот тип перечисления:
typedef NS_ENUM(NSInteger, SomeEnum4ObjC) { SomeEnumA, SomeEnumB };там может быть другое место в вашем .m файл для внесения изменений: включить скрытый файл заголовка:
#import "[YourProjectName]-Swift.h"замените [YourProjectName] на имя вашего проекта. Этот заголовочный файл предоставляет все Swift определенные @ objc классы, перечисления в ObjC.
вы можете получить предупреждение о неявное преобразование из типа перечисления... Это нормально.
кстати, вы можете использовать этот вспомогательный файл заголовка, чтобы сохранить некоторые коды ObjC, такие как #define constants.
Если вы (как и я) действительно хотите использовать строковые перечисления, вы можете создать специализированный интерфейс для objective-c. например:
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)) }конечно, это не даст вам удобства автозаполнения (если вы не определите дополнительные константы в среде objective-c).
Swift 4.1, Xcode 9.4.1:
1) Swift enum должен иметь префикс
@objcиIntтип:// in .swift file: @objc enum CalendarPermission: Int { case authorized case denied case restricted case undetermined }2) имя Objective-C-это имя перечисления + имя случая, например
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; } }и, конечно же, не забудьте импортировать заголовок Swift bridging в качестве последнего элемента в списке импорта файла Objective-C:
#import "MyAppViewController.h" #import "MyApp-Swift.h"
Comments