Как получить доступ к типу перечисления результатов swift 5 в objective-c

#ios #objective-c #swift5

#iOS #objective-c #swift5

Вопрос:

Я написал метод класса в swift-5 с его параметром Result type, теперь я хочу использовать этот метод в objective-c, возможно ли это? если да, то как?

 @objc public class DemoClass :NSObject {

    @objc public func demoMethod(completion: @escaping (Result<UIImage,Error>) -> 
     Void) {
             //some codes
      }
}
  

Как только я добавляю @objc в метод, он выдает ошибку: Метод не может быть помечен как @objc, потому что тип параметра не может быть представлен в Objective-C

Комментарии:

1. Сообщение об ошибке должно быть довольно ясным: «тип параметра ( Result<UIImage, Error> ) не может быть представлен в Objective-C». Итак, нет, вы не можете получить к нему доступ из Objective-C, потому что он там не представлен. Что вы можете сделать, (UIImage?, Error?) -> Void как это делают многие API Objective-C.

2. Это последнее, что я сделаю, изначально я хотел, если возможно, расширить / наследовать перечисление поверх результата с минимальным кодом, а затем использовать это в swift и получить доступ в objective-c

3. Вы не можете, это тот момент, который я прокомментировал по вопросу (основанному на мнении), спрашивающему, нужно ли автору удалить все его предыдущие закрытия завершения и заменить их результатом. У вас может быть «устаревший» метод для Objective-C, но это добавит вам код, например, с (UIImage?, Error?) -> Void , и вызовет внутренний метод с Result .

Ответ №1:

Результат перечисления недоступен в Objective-C. Это @frozen и не @inlinable .

А также перечисления Objective-C не могут быть общими, т. Е. Result<Success, Failure> where Failure: Error не могут быть доступны Objective-C.

Итак, что вы можете сделать, это создать класс следующим образом и выполнять другие действия по мере необходимости:

 @objc class AResult: NSObject {
    
    public private(set) var success: Any?
    public private(set) var failure: Error?
    
    private override init() {
        super.init()
        success = nil
        failure = nil
    }
    
    public convenience init<Success, Failure>(_ arg1: Success, _ arg2: Failure) where Failure: Error {
        self.init()
        success = arg1
        failure = arg2
        // Do something
    }
}
  

И объявите свою функцию: @objc func demoMethod(_ completion: (AResult) -> Void) {}

Надеюсь, это поможет.