Как передать замыкание с параметрами в функцию? (Swift) - PullRequest
0 голосов
/ 17 марта 2019

Итак, у меня есть функция, которую нужно выполнить при выполнении условия, а если нет, просто подождите 0,2 секунды, а затем повторите попытку (рекурсивно).

func myFunction(_ str1: String? = nil, _str2: String? = nil)
{
    //whatever
}

(обратите внимание, что я далАргументы являются значением по умолчанию, поэтому я могу вызывать эту функцию без указания каких-либо параметров).Теперь, вот моя функция 'delay':

func delay(_ function: @escaping (String?, String?) -> Void)
{
    if !myExternalCondition
    {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
            self.delay(function)
        }
    }
    else
    {
        function()    //error
    }
}

Это дает мне следующую ошибку: Отсутствует аргумент для параметра # 1 в вызове

Честно говоря, я бынапример, функция задержки для любого типа замыкания, независимо от его аргументов (сумм или типов).Любая помощь приветствуется;)

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

1 Ответ

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

Я думаю, вы не понимаете, как работают параметры по умолчанию.Параметры по умолчанию - всего лишь вспомогательный синтаксис.Они облегчают вызов функции непосредственно в коде, но не изменяют саму функцию.Невозможно поддерживать любое количество параметров, если они действительно необходимы;вам нужно что-то передать.

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

func myFunction(_ str1: String?, _str2: String?)
{
    //whatever
}

func myFunction() {
    myFunction(nil, nil)
}

И затем вы можете вызвать его.

func delay(_ function: @escaping () -> Void)
{
    if !myExternalCondition
    {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
            self.delay(function)
        }
    }
    else
    {
        function()
    }
}

Возможно, вы просто неправильно поняли, как работают замыкания.С вышеприведенным delay все в порядке, используя исходное определение myFunction (с параметрами по умолчанию):

delay { myFunction() }

Следующее также хорошо:

delay { myFunction("xyz") }

Дело в том, что замыкание не имеет параметров.Вы можете думать о myFunction как о «закрытии», но это не правильно.Закрытие является частью {...}.Если бы у него были параметры, вы ожидали бы синтаксис x in или $0 где-то в нем.

...