Блоки завершения ничего не возвращают

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {

        isSuccess(true, success: { (name) -> String in
            return "My name is \(name)"
        })

        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }


    func isSuccess(val:Bool, success: (name: String) -> String) {
        if val {
            success(name: "Jacky")
        }
    }

}

Я ожидаю, что он вернет строку "Меня зовут Джеки", но это не так. Но если я изменю isSuccess к:

    func isSuccess(val:Bool, success: (name: String) -> String) {
        if val {
            print(success(name: "Jacky"))
        }
    }

}

Тогда это работало правильно, почему это? Заранее спасибо!

2 ответа

Решение

Ваш блок завершения возвращает строку. Когда вы вызываете его по телефону

success(name: "Jacky")

блок завершения возвращает строку. Меня зовут Джеки. Но вы ничего не делаете с этой строкой. Вы просто вернули его и никогда не использовали. Во втором примере вы фактически использовали его - вы взяли строку из блока завершения и распечатали ее.

Например, вместо печати вы также можете написать

let stringFromCompletionBlock = success(name: "Jacky")

Таким образом, вы можете видеть, что он действительно вернул значение.


И еще одна вещь - то, что блок завершения должен вызываться как последняя вещь в функции - таким образом, вы "уведомляете", что функция завершила свое назначение, поэтому нецелесообразно использовать значение, возвращенное из блока завершения внутри той же функции. который вызвал этот блок завершения

Прежде всего замыкание в функции isSuccess должен быть объявлен таким образом. Закрытие не должно возвращать String, он должен просто принять String как парам.

func isSuccess(val:Bool, success: (name: String) -> ()) {
    if val {
        success(name: "Jacky")
    }
}

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

class ViewController: UIViewController {

    weak var label:UILabel!

    override func viewDidLoad() {

        isSuccess(true) { (name) -> () in
            dispatch_async(dispatch_get_main_queue()) {
                self.label.text = "My name is \(name)"
            }
        }            
        super.viewDidLoad()
    }

    func isSuccess(val:Bool, success: (name: String) -> ()) {
        if val {
            success(name: "Jacky")
        }
    }   
}
Другие вопросы по тегам