Objective- C Закрытие, чтобы использовать перечисление Swift - PullRequest
1 голос
/ 02 марта 2020

У меня есть Swift enum вот так:

@objc public enum Status: Int {

    case unknown;
    case ok;
    case failed;
}

Он правильно соединен с Objective- C, и я могу использовать его, как, скажем, StatusUnknown в Objective- C.

Теперь у меня есть функция с обратным вызовом:

+ (void)fetch:(void (^_Nonnull)(BOOL success))completion 

И все, что я хочу, это заменить BOOL на мое Status перечисление. Как это сделать?

Очевидно, что это не так:

+ (void)fetch:(void (^_Nonnull)(Status success))completion // Error: Unknown type name

Я мог бы использовать NSInteger так:

+ (void)fetch:(void (^_Nonnull)(NSInteger success))completion

, но тогда это не совсем ограничивающие значения to enum.

Итак, как лучше передать здесь enum?

Примечание:

  • Я упростил вопрос, в действительности enum не называется status и имеет гораздо больше значений.
  • Подпись функции должна соответствовать предыдущей подписи, но с другим аргументом

1 Ответ

2 голосов
/ 02 марта 2020

Для совместимости с target- c перечисление должно быть унаследовано от Int, например

@objc public enum Status: Int {
    case unknown
    case ok
    case failed
}

, убедитесь, что сгенерированный заголовочный файл моста "YOURPROJECT-Swift.h" содержит

typedef SWIFT_ENUM(NSInteger, Status, closed) {
  StatusUnknown = 0,
  StatusOk = 1,
  StatusFailed = 2,
};

затем в вашем .m файле

#import "YOURPROJECT-Swift.h"

...

+ (void)fetch:(void (^_Nonnull)(Status success))completion
{
    // do anything needed    
}

Clean / Build - все скомпилировано хорошо. Протестировано с Xcode 11.2.

...