Принудительный метод Objective C, возвращающий id и inout NSError, чтобы соединиться с необязательным возвратом

Рассмотрим этот класс Objective-C:

@interface TestAPI : NSObject

-(nullable id)aNullableMethod;

-(nullable id)aNullableMethodWithError:(inout NSError **)error;

@end

я использую TestAPI как абстрактный базовый класс и хотите наследовать от него в Swift.

Swift соединяет этот код, чтобы он выглядел следующим образом (т.е. меню "Сопутствующие товары" -> интерфейс Swift 4.2):

open class TestAPI : NSObject {

    open func aNullableMethod() -> Any?

    open func aNullableMethodWithError() throws -> Any
}

Проблема в том, что aNullableMethodWithError() может вернуться nil как действительное значение.

Как мне убедить Свифта в том, что aNullableMethodWithError() возвращается Any? и не Any?

Или есть лучший способ написать подпись метода Objective C?

1 ответ

Вам может понадобиться использовать NS_SWIFT_NOTHROW:

-(nullable id)aNullableMethodWithError:(inout NSError **)error NS_SWIFT_NOTHROW;

Это импортируется в Swift как:

open func aNullableMethodWithError(_ error: NSErrorPointer) -> Any?

Если вы хотите импортировать свой метод как throws-функция, вам может понадобиться изменить сигнатуру метода в соответствии с соглашением:

  • Вернуть true или не ноль без ошибок
  • Вернуть false или ноль в случае ошибки

Что-то вроде этого:

-(BOOL)aNullableMethod:(id*)object withError:(inout NSError **)error;

В Свифте:

open func aNullableMethod(_ object: AutoreleasingUnsafeMutablePointer<AnyObject?>!) throws
Другие вопросы по тегам