Как из колбек функции передать значения в swift 3?

В Swift 3 можно передавать значения из колбек функций несколькими способами. Рассмотрим несколько вариантов.

1. Использование замыканий (closures):

В Swift 3 замыкания позволяют передавать значения в качестве аргументов внутрь колбек функций. Для этого нужно передать замыкание в качестве параметра колбек функции и вызвать это замыкание с нужными значениями внутри колбека.

Пример:

func completionHandler(result: String) {
    print("Результат: (result)")
}

func asyncFunction(completion: (String) -> Void) {
    // в некотором месте вызывается колбек функции
    let result = "Hello, World!"
    completion(result)
}

asyncFunction(completion: completionHandler)

// Вывод:
// Результат: Hello, World!

В этом примере мы определяем асинхронную функцию asyncFunction, которая принимает замыкание completion в качестве параметра. Внутри функции мы определяем результат (в данном случае строку "Hello, World!") и вызываем замыкание completion с этим результатом. Затем мы определяем функцию completionHandler, которая принимает результат в качестве аргумента и просто печатает его. В конце мы вызываем asyncFunction и передаем completionHandler в качестве аргумента.

2. Использование делегатов (delegates):

Другой способ передать значения из колбек функции состоит в использовании делегатов. Делегаты - это объекты, которые представляют другие объекты и могут получать уведомления о событиях, происходящих в этих объектах. В Swift 3 делегаты обычно реализуют протоколы (protocols).

Пример:

protocol AsyncFunctionDelegate: AnyObject {
    func asyncFunctionDidComplete(result: String)
}

class MyAsyncFunction {
    weak var delegate: AsyncFunctionDelegate?

    func start() {
        // выполняются асинхронные операции
        let result = "Hello, World!"
        delegate?.asyncFunctionDidComplete(result: result)
    }
}

class MyDelegate: AsyncFunctionDelegate {
    func asyncFunctionDidComplete(result: String) {
        print("Результат: (result)")
    }
}

let myFunction = MyAsyncFunction()
let myDelegate = MyDelegate()
myFunction.delegate = myDelegate
myFunction.start()

// Вывод:
// Результат: Hello, World!

В этом примере мы определяем протокол AsyncFunctionDelegate, который содержит метод asyncFunctionDidComplete. Затем мы создаем класс MyAsyncFunction, который имеет слабую ссылку на делегата через протокол AsyncFunctionDelegate. Внутри функции start мы выполняем асинхронные операции и вызываем метод делегата asyncFunctionDidComplete. Затем мы создаем экземпляры MyAsyncFunction и MyDelegate, назначаем делегату объект MyDelegate и вызываем метод start у MyAsyncFunction.

Это два основных подхода к передаче значений из колбек функций в Swift 3. Оба подхода работают, и выбор между ними зависит от вашего стиля программирования и требований вашего проекта.