【发布时间】:2015-05-01 04:14:12
【问题描述】:
如何选择将一个函数传递给另一个函数?具体来说,假设 functionA 接受 functionB 作为参数。如果functionB不是nil,怎么在functionA里面执行functionB呢?
【问题讨论】:
如何选择将一个函数传递给另一个函数?具体来说,假设 functionA 接受 functionB 作为参数。如果functionB不是nil,怎么在functionA里面执行functionB呢?
【问题讨论】:
很难看出这有什么难处,所以也许这不是你的意思,因为它看起来如此微不足道;但无论如何,这里是:
func optionalFunctionExpecter(f:(()->())?) {
f?()
}
以下是如何使用实际函数调用它:
func g() {
println("okay")
}
optionalFunctionExpecter(g)
或者,使用实际的匿名函数调用它:
optionalFunctionExpecter { println("okay2") }
以下是使用nil 调用它的方法:
optionalFunctionExpecter(nil)
请注意,在我的optionalFunctionExpecter 实现中,当使用nil 调用时,什么都不会发生:我们不会调用f,我们不会崩溃,我们不会做任何事情。如果您需要知道 nil 已通过,您可以轻松找到:只需在 optionalFunctionExpecter 中询问是否是 f == nil 并根据需要在此基础上继续操作。为了更灵活,我们可以这样重写:
func optionalFunctionExpecter(f:(()->())?) {
if let f = f {
f()
} else {
// ... nil was passed, respond to that fact ...
}
}
【讨论】:
f?() 是可选链接(类似于maybeObj?.property 或maybeArray?[0]。如果将检查f 是否为nil,如果不是,则执行它。返回值将被包裹在一个可选项中,如果 f 是 nil 并且未执行,则返回值是 nil。
f 是一个不带参数也不返回值的函数,封装在一个 Optional 中——这是 OP 要求的。这是我书中关于函数作为参数的讨论:apeth.com/swiftBook/ch02.html#_function_as_value