Swift函数的一个非常方便的功能是函数参数可以有default values个:

func someFunction(parameterWithDefault: Int = 42) {
    //if no arguments are passed to the function call,
    //value of parameterWithDefault is 42
}

如果一个参数是一个闭包,有没有办法让它有一个默认值?请参见下面的示例:

func sendBody(
    body: NSData? = nil,
    success: (data: NSData) -> Void,
    failure: (data: NSData?) -> Void) {
}

有没有办法在调用sendBody时不强制开发人员传递successfailure的值?

推荐答案

是的,函数只是值,所以可以提供它们作为默认值

// just to show you can do it with inline closures or regular functions
func doNothing<T>(t: T) -> Void { }

func sendBody(
    body: NSData? = nil,
    success: (data: NSData) -> Void = { _ in return },
    failure: (data: NSData?) -> Void = doNothing
)
{  }

或者,您可以将它们设置为可选,这样您就可以检测调用方是否通过了一个:

func sendBody(
    body: NSData? = nil,
    success: ((NSData) -> Void)? = nil,
    failure: ((NSData?) -> Void)? = nil
    )
{ success?(NSData()) }

sendBody(success: { _ in print("ah, yeah!") })

如果这样做,也值得注意:如果调用方使用尾随闭包语法,则参数列表中的闭包将为last.因此,您希望最后一个是用户最有可能提供的,这可能就是成功的结局:

func sendBody(
    body: NSData? = nil,
    success: ((NSData) -> Void)? = nil,
    failure: ((NSData?) -> Void)? = nil
    )
{
    if success != nil { print("passed a success closure") }
    if failure != nil { print("passed a failure closure") }
}

// this prints "passed a failure closure"
sendBody { data in
    print("which closure is this?")
}

除此之外,函数声明中的顺序对调用方并不重要——默认参数可以按任何顺序提供.

Swift相关问答推荐

复选标记动画的问题

Swift 5.10:无法从非隔离的deinit访问属性*,这是Swift 6中的错误''''

如何在Swift中获得与Python相同的HMAC—SHA512签名?

更改正在进行的异步任务的完成(SWIFT并发)(&q;)?

避免嵌套导航TabView

';NSInternal不一致异常';,原因:';可见导航栏Xcode 15.0 Crash请求布局

关闭 SwiftUI TabView 中的子视图

物理主体未与 spritekit Swift 的网格图案上的纹理图像对齐

将弱引用作为类函数引用传递时,弱引用无法按预期工作

Swift 并发:@MainActor 对象上的通知回调

LeetCode 249. 分组移位字符串

为什么 Apple Scrumdinger Sample App 使用两个事实来源?

SwiftUI Preview 不适用于 Core Data

如何更改 Picker 的边框 colored颜色

将阻塞函数集成到 Swift 异步中

Swift 读写图片占用大量内存

在 Swift 中,如何查看 Process() 传递给 shell 的字符串?

使用 Swift 在 iOS 8 中为应用程序图标添加徽章

如何以编程方式读取 wkwebview 的控制台日志(log)

如何在 Swift 中将 NSURL 转换为字符串