我试着理解swift中回调的主要概念 我有以下代码:
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我的问题是为什么不打印数字1。
答案 0 :(得分: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
参数变量是两个不同的变量 - 范围规则意味着在temp函数内声明的那个掩盖了一个在外部范围内。但它们非常不同(事实上,它们是不同的类型 - 一个是字符串,另一个是字符串的2元组和错误)。
尝试使用reading this获取Swift中一阶函数和闭包的简短介绍。