#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) {}
Надеюсь, это поможет.