Вызов закрытия внутри закрытия - PullRequest
0 голосов
/ 08 марта 2019

Это мой код:

var work: ((Int, completionHandler: (() -> ()) -> ()))?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    work(1, {
        // Does not work.
    })

    workAsMethod(amount: 1) {
        // Works.
    }

    work = { (amount, completionHandler) in
        // Does not work
        completionHandler()
    }

    return true
}

func workAsMethod(amount: Int, completionHandler: @escaping (() -> ())) {
    // Works
    completionHandler()
}

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

Каков правильный синтаксис для вызова замыкания внутри замыкания, чтобы уведомить «слушателя» о том, что работа выполнена?

1 Ответ

1 голос
/ 08 марта 2019

Тип вашей work необходимой работы закрытия:

var work: ((Int, _ completionHandler: () -> ()) -> ())?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Use optional chaining here to unwrap work before calling
    work?(1, {
        // This now works.
    })

    workAsMethod(amount: 1) {
        // Works.
    }

    work = { (amount, completionHandler) in
        // This now works
        completionHandler()
    }

    return true
}

func workAsMethod(amount: Int, completionHandler: @escaping (() -> ())) {
    // Works
    completionHandler()
}

work - это дополнительное закрытие, которое принимает Int и () -> () и ничего не возвращает -> ().

Если вы укажете свой тип для work, ваш completionHandler будет иметь тип (() -> ()) -> (), что означает, что ваш completionHandler принимает закрытие () -> () и ничего не возвращает.Вы хотите, чтобы ваш completerHandler не принимал никаких параметров.Из-за неуместных ( и ) ваш work был фактически необязательным кортежем , а не типом закрытия.

...