gpt4 book ai didi

ios - swift闭包在函数中用作参数时是否可以设置默认值?

转载 作者:IT王子 更新时间:2023-10-29 05:02:29 24 4
gpt4 key购买 nike

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!") })

如果您这样做也值得注意:如果调用者使用尾随闭包语法,这将是参数列表中的最后闭包。所以你希望最后一个是用户最有可能想要提供的那个,这可能是成功闭包:

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?")
}

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

关于ios - swift闭包在函数中用作参数时是否可以设置默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31159045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com