Как я могу сделать реализацию протокола в качестве аргумента функции - PullRequest
0 голосов
/ 04 сентября 2018

Как мне создать протокол в качестве аргумента функции.

В Android java мы можем сделать аргумент интерфейса следующим образом.

Button.setOnClickListener(new View.OnClicklistener()
{
    @Override
    public void onClick(View v)
    {

    }
});

Но как мне сделать то же самое в Swift. Например, у меня есть следующий протокол, как я могу передать протокол при его создании.

protocol ButtonListener
{
    func onClick()
}

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Похоже, что существует недоразумение относительно того, что вы должны использовать для его достижения. Возможно, вы хотите передать замыкание в качестве параметра функции.

Ссылаясь на язык программирования Swift - Замыкания :

Закрытия - это автономные блоки функциональности, которые можно передавать вокруг и используется в вашем коде. Закрытия в Swift похожи на блоки в C и Objective-C и лямбда в других языках программирования.

Пример:

protocol Foo {
    func myFunc(onClick: (_ myView: UIView) -> Void)
}

class MyClass: Foo {
    func myFunc(onClick: (UIView) -> Void) {
        // ...
    }
}

Здесь у нас есть Foo протокол, содержащий myFunc, который имеет параметр закрытия типа (UIView) -> Void.

Таким образом:

let object = MyClass()

object.myFunc { view in
    // you can access `view` here as:
    view.backgroundColor = ...
    view.frame = ...
}
0 голосов
/ 04 сентября 2018

Вы можете дать его по протоколу.

protocol ButtonListener {}

extension ButtonListener where Self: UIView {
    func btnClick() {
        // print func
    }
}
0 голосов
/ 04 сентября 2018

В Swift эти однопроцессные протоколы, так как обработчики событий не нужны. В Swift вы можете создать любой тип closure , который вы хотите.

Ваш метод onClick может быть представлен типом закрытия () -> Void (не принимает параметров и возвращает Void). Вместо setOnClickListener в качестве метода вы можете просто объявить onClick как свойство:

var onClick: (() -> Void)?

И тогда вы можете установить его так же, как и для любого другого свойства:

onClick = {
    print("I am clicked!")
}

Чтобы позвонить onClick, вы можете сначала развернуть его, чтобы убедиться, что это не ноль:

if let onClick = self.onClick {
    onClick()
}
// or
onClick?()

Если вы знакомы с Java 8, типы замыканий подобны функциональным интерфейсам, за исключением того, что вы получаете больше свободы с типами замыканий. Consumer<String> будет соответствовать (String) -> Void, Function<String, Integer> будет соответствовать (String) -> Int и т. Д.

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