Как мне вызвать метод Swift с замыканием из Objective-c? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть следующий метод Swift:

public func login(userLogin: String, userPassword: String, completion:@escaping (_ result: Result<Data, PZError>) -> ())

И я хотел бы вызвать его из Objective-C, но не могу определить часть закрытия:

[apiController loginWithUserLogin:userLogin userPassword:password completion:???];

Чтомой код завершения будет выглядеть в Objective-C?

1 Ответ

0 голосов
/ 06 июня 2018

Невозможно вызвать такой метод напрямую из Objective-C.

Если тип Result является перечислением с нетривиальными объектами case или структурой, он не будет работать, потому чтоObjective-C не поддерживает типы значений.Также Objective-C не поддерживает универсальные типы, такие как Result<T>.

. Один из способов исправить это сделать оболочку, т.е. написать второй метод в Swift, который адаптирует типы:

func login(userLogin: String, userPassword: String,
    completion: @escaping (_ resultData: Data?, _ resultError: NSError?) -> Void)

В этом методе вы вызываете свой исходный логин, а во внутреннем обратном вызове завершения распаковываете свой Result в Data и NSError (преобразование из PZError) и передаете им блок завершения вызывающего абонента.

...