【问题标题】:Why can't i ignore a closure parameter with a default function in Swift?为什么我不能在 Swift 中忽略带有默认函数的闭包参数?
【发布时间】:2017-10-13 21:25:18
【问题描述】:

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

调用中的参数“closureFuncWithDefault”缺少参数
插入 'parameterClosureFuncWithDefault: 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 类和此类东西不是相关的东西,而是具有默认闭包参数并能够使用它的正确方法。

【问题讨论】:

  • 对我来说很好。您可以尝试清理您的项目并重建吗?
  • 无关,我不建议在另一个线程上异步调用某些东西时使用unowned。当另一个运行运行关闭时,您无法保证self 是否仍然存在。使用weak

标签: swift closures default-parameters


【解决方案1】:

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

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 { ... }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2011-08-30
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多