Выполнить закрытие из другого метода в расширении Swift - PullRequest
0 голосов
/ 29 мая 2020

У меня есть класс, который является делегатом пользовательского модального представления, поэтому у него есть метод, когда модальное окно было отклонено. Я расширяю этот класс, и в расширении у меня есть метод, который принимает завершение закрытия.

Я не могу писать в основной реализации класса или модальной реализации - только расширение.

Я хочу выполнить закрытие, когда модальное окно закрыто, но я не могу понять это самостоятельно. Возможно ли это вообще?

Вот пример того, что я хочу сделать:

extension MyClass {
    func method(completion: (Int) -> ()) {
        // showing the modal
    }
}

extension MyClass: ModalDelegate {
    func modalDismissed() {
        // here I want to execute the completion passed to method()
    }
}

1 Ответ

2 голосов
/ 29 мая 2020

Назначьте завершение как переменную свойству MyClass в method и вызовите его в modalDismissed:

class MyClass {
    var classCompletion: (() -> ())?
}

extension MyClass {
    func method(completion: @escaping () -> ()) {
        classCompletion = completion
    }
}

extension MyClass: ModalDelegate {
    func modalDismissed() {
        classCompletion?()
    }
}

Обновление: если вы не можете «написать в основном реализация класса », вот метод, использующий свойство static. Это взлом, у которого много ограничений, но он работает. В противном случае без записи в основную реализацию вы ничего не сможете сделать.

extension MyClass {
    static var classCompletion: (() -> ())?

    func method(completion: @escaping () -> ()) {
        MyClass.classCompletion = completion
    }
}

extension MyClass: ModalDelegate {
    func modalDismissed() {
        MyClass.classCompletion?()
    }
}
...