2017-10-13 105 views
0

如果没有提供闭包,我有一个闭包作为默认为'虚拟'函数的参数的方法。然而,每当我试图忽略使用默认参数,编译器会引发错误:为什么我不能在Swift中忽略一个具有默认函数的闭包参数?

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类和这些东西不是相关的东西,而是有一个默认的关闭参数并能够使用它的正确方法。

+0

适合我。你可以尝试清理你的项目和重建? – nathan

+0

不相关的,我不会建议在另一个线程上异步调用某些东西时使用'unowned'。您无法保证当另一个运行运行闭包时,“self”是否仍然存在。使用'弱'。 – Rob

回答

0

常见的语法是使用一个可选的关闭,与?称之为:

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 { ... } 
} 
相关问题