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

Рассмотрим этот класс 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 Ответ

0 голосов
/ 19 сентября 2018

Вам может понадобиться использовать 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;

В Swift:

open func aNullableMethod(_ object: AutoreleasingUnsafeMutablePointer<AnyObject?>!) throws
...