хранить функции в переменных Telegram исходный код - PullRequest
0 голосов
/ 18 февраля 2019

Я вижу этот код в приложении с открытым исходным кодом Telegram, как создать такую ​​функцию и где находятся коды этого приложения?этот класс является окончательным и не имеет делегата нашего протокола

 var vote:(MessageId, Data?) -> Void = { _, _ in }

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

var vote:(Int, String?) -> Void = { _, _ in }

vote = { (id, data) in print("\(id) \(data)") }

vote(32, "Hello")

Обратите внимание, что я изменил типы параметров в моем примере, так как я не являюсьзнакомы с Telegram классами

0 голосов
/ 18 февраля 2019

Я не знаю, где вы это видели, но это переменная закрытия.Вы можете вызвать его в классе / структуре, где объявлено это vote, а затем будет вызван код внутри замыкания с определенными параметрами.

Например, если вы назначите vote, как это

someClass.vote = { messageId, data in // name parameters or not: _,data ; messageId,_ ; _,_
    print("Voted")
}

, тогда, если vote вызывается изнутри класса / структуры,

vote(someMessageId, someData)

... "Voted" печатается.


Итак, это полезный шаблон делегатазамена, которая позволяет вам объявить из одного класса / структуры, что произойдет, когда это замыкание будет вызвано из другого класса / структуры без объявления какого-либо протокола, назначения delegate и наличия дополнительных методов.

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