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

标签 swift closures default-parameters

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

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/

相关文章:

javascript - 将定时器 ID 放入其函数中

python - "Least Astonishment"和可变默认参数

ios - 在 Storyboard中设计点击展开单元格

swift - 如何比较可选词典? swift 3

ios - 如何在 App Store 中发布之前添加按钮(在 App Store 上评价我的应用程序)

ios - 遍历已解析的数组

javascript - 从每个实例都有一个私有(private)闭包的模块导出一个类,但它的原型(prototype)链仍然可以扩展?

multithreading - Rust 闭包如何工作以及它如何执行闭包?

function - 为什么 typescript 允许在必需参数之前使用默认参数?

python - "Least Astonishment"和可变默认参数