Как создать закрытие с конкретными typealias в swift? - PullRequest
3 голосов
/ 19 октября 2019

Я использую пакет swift OnboardKit , и для него требуется определенный тип закрытия, который я не могу понять. Класс OnboardPage требует типа OnboardPageAction для параметра action.

public typealias OnboardPageCompletion = ((_ success: Bool, _ error: Error?) -> Void)
public typealias OnboardPageAction = (@escaping OnboardPageCompletion) -> Void
OnboardPage(title: "Title",
            description: "description",
            action: action)

Это моя последняя попытка, я попробовал несколько вариантов в этом направлении.

let action: ((_ success: Bool, _ error: Error?) -> ()) = {_,_ in
    print("help")
}

Сбой XCode с сообщением об ошибке:

Невозможно преобразовать значение типа '(Bool, Error?) -> Void' в ожидаемый тип аргумента 'OnboardPageAction?'(aka 'Необязательно <(@ escaping (Bool, Необязательно) -> ()) -> ()>')

Что я здесь не так делаю? Ошибка в моем определении замыкания или в том, как я использую его в вызове OnboardPage ()? Спасибо:)

(я узнал подробности о замыканиях здесь Замыкания Swift How To , но я не могу определить правильный тип замыкания, которого ожидает пакет)

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Объявление действия должно выглядеть так, чтобы соответствовать приведенным определениям:

let action: OnboardPageAction = { (_ closure: ((_ success: Bool, _ error: Error?) -> Void)) in
    print("action")
}
1 голос
/ 19 октября 2019

Судя по контексту, я предполагаю, что цель параметра action - дать вам возможность запустить некоторый код при представлении OnboardPage. Это «действие» может занять некоторое время (оно может не завершиться, когда action вернется), поэтому оно дает вам параметр обработчика завершения, который вы можете вызвать, чтобы указать, что то, что вы хотите сделать, сделано.

Есливы просто хотите напечатать Hello, вы можете просто вызвать параметр после того, как вы напечатали hello, чтобы указать, что вы завершили то, что хотите сделать:

OnboardPage(title: "Title",
        description: "description",
        action: { completion in
            print("Hello")
            completion(true, nil)
        })

или просто

OnboardPage(title: "Title",
        description: "description") {
            print("Hello")
            $0(true, nil)
        }

ПервыйАргумент указывает, является ли действие успешным, второй содержит необязательную ошибку для случая, когда оно не выполнено.

...