Можно ли использовать перечисление 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

561   6  

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

    Ничего не найдено.