Как извлечь закрытие в типалиас?

Я немного заблудился с typealias, следующий фрагмент кода работает нормально, и я хотел бы провести рефакторинг с использованием typealias.

NEVPNManager.shared().loadFromPreferences(completionHandler: vpnLoadHandler)

func vpnLoadHandler(_: (Error?)) -> Void {

}

Вместо этого я хотел бы создать типалиас:

typealias vpnCompleteClosure = (_: (Error?)) -> Void

func vpnLoadHandler(complete: @escaping vpnCompleteClosure) {
}

NEVPNManager.shared().loadFromPreferences(completionHandler: vpnLoadHandler)

К сожалению, это больше не компилируется:

Невозможно преобразовать значение типа '(@escaping vpnCompleteClosure) -> ()' (aka '((Необязательно) -> ()) -> ()') в ожидаемый тип аргумента '(Ошибка?) -> Пустота'

Что мне не хватает?

ОБНОВЛЕНИЕ:

open func loadFromPreferences(completionHandler: @escaping (Error?) -> Swift.Void)

person Houman    schedule 20.03.2018    source источник
comment
не могли бы вы добавить loadFromPreferences(completionHandler: ) подпись   -  person deoKasuhal    schedule 20.03.2018
comment
Конечно, добавил, спасибо   -  person Houman    schedule 20.03.2018
comment
Псевдоним типа для чего? Ваш func vpnLoadHandler не принимает аргументов в пользу закрытия.   -  person Martin R    schedule 20.03.2018


Ответы (1)


loadFromPreferences(completionHandler:) ожидает параметр completion типа (Error?) -> Void. Ваш typealias передает ((Optional) -> Void) -> Void. Ваша ошибка сообщает вам, что у вас несовпадающие подписи.

При этом вам нужно выяснить, какова сигнатура метода верхнего уровня. Что вы называете своим завершениемHandler? Что вы ожидаете получить от этого?

Должен признать, что меня смущает ваша цель передать vpnLoadHandler(complete:) в loadFromPreferences(completionHandler:)

Ваш метод будет выглядеть как (((Error?)-> Void) -> Void) -> Void

напишите свой typealias как:

 typealias VPNCompletionHandler = (Error?) -> Void

 func vpnLoadHandler(completion: @escaping VPNCompletionHandler)
person SirCJ    schedule 20.03.2018