2016-08-06 636 views
1

Ich habe eine Funktion, die ich in meinem Code verwendet habe, aber ich muss jetzt einen Abschluss-Handler übergeben (damit ich eine dispatch_group beenden kann). Ich wollte es nicht den Rest meines Codes bewirken, damit ich den Namespace aus diesem versucht zu ändern:Passing closure in Swift

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase) 

dazu:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (())? = nil) 

Wenn ich einen Verschluss, um es zu passieren, wie so :

cloud.uploadRecordable(testRecordable, database: database) { 
     dispatch_group_leave(forCloudToBeClearOfTestRecord) 
    } 

ich diesen Fehler:

Function produces expected type 'Void' (aka '()'); did you mean to call it with '()'? 

Ich glaube, dass, weil das completionHandler: (())? Argument einen Standardwert von nil hat der Compiler durch die Schließung ist verwirrt, aber wenn ich das habe ich versucht, noch gleiche Fehlermeldung erhalten:

cloud.uploadRecordable(testRecordable, database: database, completionHandler: { 
     dispatch_group_leave(forCloudToBeClearOfTestRecord) 
    }) 

Ich habe nicht viele Schließungen geführt, also könnte ich es falsch machen, aber (())? hat für mich in der Vergangenheit funktioniert ... Auch wenn es einen Unterschied macht, wird dies in meinen Tests nicht mein regulärer Code genannt.

Irgendwelche Hilfe auf was ich hier vermisse?

-EDIT-

Nach der Schließung Argument (() ->())? Ändern bekomme ich diesen Fehler:

Cannot invoke `uploadRecordable` with an argument list of type '(MockRecordable?, database: CKDatabase, completionHandler: (() ->())?)' 

Die ersten beiden Argumente wurden gut funktioniert, aber es ist nicht mein Verschluss mag noch . Sollte ich etwas in die erste Zeile setzen (z. B. var in), obwohl ich ihm keine Variablen gebe. Danke im Voraus.

+0

Danke, werde ich versuchen, dass jetzt. Warum sollte ich nicht wollen, dass Void zu meiner eigenen Erbauung zurückkehrt? –

+0

Ich mache eine Follow-up-Bearbeitung in Kürze. –

+0

In Bezug auf den neuen Fehler übergeben Sie einen optionalen 'MockRecordable' als ersten Parameter. Vielleicht solltest du das auspacken? – Rob

Antwort

1

In der Funktionsdeklaration, anstatt den Parameter als completionHandler: (())? zu deklarieren, möchten Sie completionHandler: (() -> Void)? oder completionHandler: (() ->())?.

So:

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> Void)? = nil) { ... } 

Oder

func uploadRecordable<T: Recordable>(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() ->())? = nil) { ... } 
+0

Danke nochmal @Rob –