如何有一个可选的尾随闭包?

时间:2015-06-19 00:02:42

标签: swift closures

我试图编写一个我可以使用尾随闭包语法调用的函数,如下所示:

func hello( message: String, closure: (( msg: String ) -> Void)?) {

   println( "called hello with: \(message)" );

   closure?( msg: message );

}

我希望能用一个闭包来调用这个函数:

hello( "abc" ) { msg in

    let a = "def";

    println("Called callback with: \(msg) and I've got: \(a)");

};

并且没有关闭,因为它是可选的:

hello( "abc" )

后者不起作用。它说我不能用(String)的参数列表调用hello。

我正在使用XCode 6.3.2,我在游乐场中测试了这段代码。

1 个答案:

答案 0 :(得分:3)

我不确定你的可选定义完全正确。这并不意味着您不需要为closure参数提供值;这意味着closure可以有一个值(在你的情况下是一个闭包)或者是nil。因此,如果您想在不提供闭包的情况下调用hello,您可以写:

hello("abc", nil)

但是,您可以在使用默认参数值后实现目标(我建议您查看The Swift Programming Guide: Functions)。你的职能是:

// Note the `= nil`:
func hello(message: String, closure: ((msg: String ) -> Void)? = nil) {
    println("called hello with: \(message)")

    closure?(msg: message)
}


// Example usage:
hello("abc")
hello("abc") { println($0) }