Что происходит внутри блока кода после вызова функции в Swift? - PullRequest
0 голосов
/ 05 августа 2020

Я попытался привести минимальный пример, пожалуйста, простите меня, если есть какие-либо ошибки / проблемы:

func foo(numberOfItems: Int) {
    let myArray = Array()
    let count = 0
    
    for _ in 0..<(numberOfItems) {
        let item = count
        myArray.append(item)
        count += 1
    }
}

func bar() -> Int {
    foo(numberOfItems: 5) { (item) in // what does this do?
        return item
    }
}

В функции bar, что делает блок кода с ключевым словом in после звонка на foo делать? Или, если этот конкретный пример c не имеет смысла, в каких обстоятельствах можно использовать что-то подобное?

Ответы [ 4 ]

0 голосов
/ 05 августа 2020

Код, который вы указали выше, имеет неправильный синтаксис. То, что вы описываете, - это закрытие. Этот закрывающий «блок» будет выполнен (и любой код в нем) после завершения вызова функции (есть исключения из этого, поскольку некоторые функции более высокого порядка используют обработчики завершения, которые выполняются асинхронно) «Замыкания часто вызываются асинхронно, но они не работают» Это должно быть. Функции более высокого порядка, такие как map, filter, sorted и т. д. c, используют замыкания, которые вызываются синхронно. - Duncan C ".

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

Ниже приведен простой пример, где у вас есть анимация и некоторый код для выполнения каких-либо действий, когда это будет завершено, внутри блок завершения или «закрытие», вы можете установить параметры (если вы используете sh), чтобы затем вернуться, когда этот блок завершится. Ниже я добавил "_", это означает отсутствие параметров.

UIView.animate(withDuration: 0.5, animations: { _ in
    //execute your code here 
}, completion: { _ in 
    //THis is also a closure where you can execute code after the animation is finished. 
})

Другой пример:

Вызов API функции

func foo(x: String, completion:(Bool?, String?)->Void){
    //do your code here 
    //when code is finished assuming it is successful call completion handler
    //usually there is a condition to meet so that if the api call fails the completion handler will be completionHandler(false, "failure")
    completionHandler(true, "success")
}

Затем, когда вы хотите использовать эту функцию ниже, вот так ...

    foo(x: "test", completionHandler: {result, response in
        if result == true {
            print("success")
            //do extra stuff here
        } else {
            print("Failure")
            //do extra stuff here
        }
    })

Объявленные переменные «response» и «result» являются предполагаемыми типами обработчика завершения в этом случае (Bool ?, String?). Эти переменные могут называться как угодно, кроме их типы предполагаются.

Надеюсь, это поможет

0 голосов
/ 05 августа 2020

Процитируем Apple Swift iBook:

Синтаксис выражения закрытия:

Синтаксис выражения закрытия имеет следующую общую форму:

{ (parameters) -> return type in
    statements
}

И

Начало тела замыкания вводится ключевым словом in. Это ключевое слово указывает, что определение параметров замыкания и типа возвращаемого значения завершено, и тело замыкания вот-вот начнется.

Ваш пример не имеет смысла, так как функция foo не взять закрытие.

Выдержка из: Apple In c. «Язык программирования Swift (Swift 5.1)». Apple Книги. https://books.apple.com/us/book/the-swift-programming-language-swift-5-2/id881256329

Выдержка из: Apple In c. «Язык программирования Swift (Swift 5.1)». Apple Книги. https://books.apple.com/us/book/the-swift-programming-language-swift-5-2/id881256329

0 голосов
/ 05 августа 2020

Это закрытие, используемое в качестве обратного вызова в swift. Пожалуйста, обратитесь к приведенной ниже ссылке для получения более подробной информации о синтаксисе и использовании.

https://docs.swift.org/swift-book/LanguageGuide/Closures.html

0 голосов
/ 05 августа 2020

'Начало тела замыкания вводится ключевым словом in. Это ключевое слово указывает, что определение параметров замыкания и типа возвращаемого значения завершено, и тело замыкания вот-вот начнется. *https://docs.swift.org/swift-book/LanguageGuide/Closures.html

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