gpt4 book ai didi

swift - 为什么我不能忽略 Swift 中默认函数的闭包参数?

转载 作者:行者123 更新时间:2023-11-30 12:05:21 26 4
gpt4 key购买 nike

我有一个以闭包作为参数的方法,如果未提供闭包,则默认为“虚拟”函数。但是,每当我尝试省略默认参数时,编译器都会抛出错误:

Missing argument for parameter 'closureFuncWithDefault' in call
Insert 'parameterClosureFuncWithDefault: <#(object) -> Void#>'

我的代码如下:

func functionWithDefault (object: SCNReferenceNode = SCNReferenceNode(),
closureWithDefault: @escaping (_ object: SCNReferenceNode)->Void = { _ in return }) {

otherClassInstance.loadObject (object, loadedHandler: { [unowned self] loadedObject in DispatchQueue.main.async {

self.otherMethod (loadedObject)
closureWithDefault (virtualObject)
}
})

}

然后从其他地方:

// some code

var objectThing = SCNReferenceNode (URL: ..... )

//
// code block...
//

functionWithDefault (object: objectThing) // <-- This throws the error.

SCN 类和此类东西不是相关的东西,而是具有默认值的闭包参数并能够使用它的正确方法。

最佳答案

常见的语法是使用可选的闭包,用 ?:

调用它
func functionWithDefault (object: SCNReferenceNode = SCNReferenceNode(), closure: @escaping ((_ object: SCNReferenceNode) -> Void)? = nil) {
otherClassInstance.loadObject (object) { [unowned self] loadedObject in
DispatchQueue.main.async {
self.otherMethod (loadedObject)
closure?(virtualObject)
}
}
}
<小时/>

或者,考虑一个更简单的示例:

func foo(completion: @escaping ((Bool) -> Void)? = nil) {
performAsynchronousTask { success in
completion?(success)
}
}

然后您可以将其称为:

foo()

或者

foo { success in
if success { ... } else { ... }
}

关于swift - 为什么我不能忽略 Swift 中默认函数的闭包参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738236/

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