2017-10-13 36 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 { ... } 
} 
相關問題