Как объявить делегата в строке? - PullRequest
0 голосов
/ 19 января 2020

В Java есть шаблон, в котором делегат может быть объявлен в строке вместо того, чтобы родительский класс соответствовал интерфейсу:

Например:

public class MyClass {

    interface Delegate {
        void completion(Boolean succeeded);
    }

    void doSomething(Delegate delegate) {
        delegate.completion(true);
    }

    void myMethod() {

        doSomething(new Delegate() { // <-- declared in-line
            @Override
            public void completion(Boolean succeeded) {
                // ...
            }
        });
    }
}

В Swift я могу заставить MyClass соответствовать протоколу Delegate и переопределить методы делегата на уровне класса. Как я могу сделать это в строке, как в шаблоне Java?

Ответы [ 2 ]

1 голос
/ 19 января 2020

Swift не имеет понятия анонимных классов. Однако у него есть понятие вложенных классов. Вы могли бы написать что-то вроде этого:

func myMethod() {
    class DelegateImpl: Delegate { ... }

    doSomething(DelegateImpl())
}

Осторожно, однако, что делегаты обычно объявляются как weak, что означает, что вновь выделенный экземпляр будет немедленно освобожден. Это связано не с тем, как класс объявляется (т. Е. Вложенным вместо встроенного), а с правилами управления памятью Swift (он же AR C).

Однако, как отмечали другие, замыкания может быть более подходящим для такого рода функций.

1 голос
/ 19 января 2020

В Swift вы не можете определить встроенный протокол (внутри другого типа, такого как Class, Struct или Enum).

Однако есть более современное решение, которое должно быть очень близко к тому, что вы ищете: Затворы .

Затворы

class MyClass {

    // define your closure, make it as complex as you want
    typealias CompletionType = (Bool) -> ()

    // this method accepts a closure as parameter and will call it
    func doSomething(completion: @escaping CompletionType) {
        completion(true)
    }

}

Тест

let myClass = MyClass()

myClass.doSomething { result in
    print(result)
}

Выход

true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...