Блоки завершения ничего не возвращают
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")
}
}
}