2017-03-22 2 views
0

Ich möchte eine Schließung nach Verzögerungszeit durchführen, aber ein Laufzeitfehler aufgetreten. Ich weiß, GCD kann das einfacher, aber ich möchte wissen warum.EXC_BAD_ACCESS beim Ausführen einer Schließung

danke.

Hier ist mein Code:

func perform(_ aClosure:@escaping()->Void, afterDelay delay: TimeInterval) { 
    self.perform(#selector(fire(closure:)), with: aClosure, afterDelay: delay) 
} 

func fire(closure:()->Void) { 
    closure() // error 
} 

self.perform({ 
    print("closure do something... ...") 
}, afterDelay: 2) 
+1

Ich denke, es ist weil Selektor nicht Swift Closure als ein Objekt erwartet. Es ist nicht übereinstimmend. – Shmidt

Antwort

2

Wie alle (einschließlich Sie;>) sagt, GCD nutzen. Wenn aus welchen Gründen auch immer, Sie beharren perform(_:with:afterDelay:) auf, versuchen Sie den Typ des closure Parameter Any Wechsel:

func fire(closure: Any) 
{ 
    (closure as!()->Void)() 
} 

Siehe this thread für weitere Informationen. Auch aus section "id Compatibility" in "Verwenden von Swift mit Cocoa und Objective-C (Swift 3.0.1)":

Der Objective-C-ID-Typ wird durch Swift als Jede Art importiert. Bei Kompilierzeit und Laufzeit führt der Compiler eine universelle Bridging Konvertierungsoperation ein, wenn ein Swift-Wert oder -Objekt in Objective-C als ID-Parameter übergeben wird. Wenn ID-Werte in Swift als Any importiert werden, behandelt die Laufzeit automatisch das Zurückübersetzen auf Klassenreferenzen oder Swift-Werttypen.

und NSObject ‚s perform(_:​with:​after​Delay:​)API Reference:

einen Selektor
ein Selektor, der die Methode aufzurufen identifiziert. Die Methode sollte keinen signifikanten Rückgabewert haben und sollte ein einzelnes -Argument vom Typ id oder keine Argumente enthalten.

+0

Es ist eine genaue Antwort. Vielen Dank. – ovo

Verwandte Themen