2015-03-15 4 views
0

Я пытаюсь понять основную концепцию обратных вызовов в быстрой у меня есть следующий код:быстр обратный вызов не печатает

typealias ImageHandler = (String,NSError?) -> Void 

func PostOnSocialMedia(image:String?){ 
    println(0) 

    Post({(image)->Void in 
    println(1) 
    }) 

    println(2) 
} 

func Post(handler:ImageHandler){ 
    println(3) 
} 

мой выходной код 0,3,2 и мой вопрос, почему Безразлично» t напечатать номер 1.

ответ

1

Это не печать 1, потому что вы передаете функцию, которая никогда не вызывается.

Это:

Post({ (image)->Void in 
    println(1) 
}) 

объявляет временную функцию (а «выражение закрытия» - быстрый простой способ объявить анонимные функции, между { }), который принимает аргумент в (String,NSError?) пары, и ничего не возвращает. Затем он передает эту функцию в функцию Post.

Но функция Post ничего не делает с этим. Для запуска функции ее нужно вызвать. Если вы изменили Post функцию следующим образом:

func Post(handler:ImageHandler){ 
    println(3) 

    // call the handler that was passed in... 
    handler("blah",nil) 
} 

вы увидите, что печать 1.

Отметим, что image аргумент получен PostOnSocialMedia и переменная image аргумент внутри временной функции две разные переменные - правила видимости означают, что объявленный внутри временной функции маскирует ту, что находится во внешней области. Но они очень разные (на самом деле они разные типы - одна строка, а вторая - 2-х кортежей строки и ошибка).

Попробуйте reading this для краткого введения функций и замыканий первого порядка в Swift.

Смежные вопросы