2016-07-28 5 views
1

Im derzeit keine Funktion vom Typ erstellen() ->() in Swift mit xCode ...
bisher im bei deniOS Swift-Funktion mit Typ() ->()

func successBlock() -> Void { 
    //code 
    return() 
} 

aber das ist nur() nicht() ->()
ich mag diese Funktion den Typen passen() ->(), weil diese Funktion:

func loginToFacebookWithSuccess(callingViewController: UIViewController, successBlock:() ->(), andFailure failureBlock: (NSError?) ->()) { 

würde die successBlock() übergibt func als Variable drin.
Ich habe fast das gleiche Problem mit dem failureBlock
oder bin ich auf dem falschen Weg?

Danke, spinhaxo

+0

Leere kehrt leer –

+0

Verwendung Abschluss für Ihr Konzept –

+0

dies sehen https://thatthinginswift.com/completion-handlers/ –

Antwort

2

successBlock eine Funktion ist.
Sie brauchen Verschlüsse.

let successBlock:() ->() = { 
    // do something here... 
} 

let failureBlock: (NSError?) ->() = { error in 
    // do something with the error... 
} 

Wenn Sie sie nicht speichern möchten, können Sie sie nur definieren, während das Verfahren wie folgt aufrufen:

loginToFacebookWithSuccess(
    callingController, 
    successBlock: { 
    // do something here... 
    }, andFailure: { error in 
    // do something with the error... 
    } 
) 
1

scheint, dass Sie mit dem Ergebnis des Aufrufs der Schließung eines Verschlusses sind verwirrend.

Sie müssen nur successBlock, die eine Schließung des Typs () ->() ist. (Aka () -> Void)

Aber successBlock() stellt das Ergebnis successBlock des Aufrufs, die einen Leerwert (aka ()) sein kann, kein Verschluss.

Fast gleich für failureBlock. Übergeben Sie das Ergebnis nicht, wenn Sie Closures aufrufen, schließen Sie die Closures selbst.

2

Wenn Sie sich entschieden haben, mit func zu gehen, übergeben Sie den Namen der Funktion ohne die Klammern. Übergeben Sie daher successBlock anstelle von successBlock().

loginToFacebookWithSuccess(someViewController, successBlock: successBlock, andFailure: failureBlock) 

Das ist, weil die Art der Funktion successBlock ist () ->() während dessen Rückgabetyp nur () ist.

Extra:

  1. () hat einen Aliasnamen, die Void ist: public typealias Void =().

Sie können sogar weglassen Void noch ():

func successBlock() { 
    //code 
    //no return statement needed 
} 

func failureBlock(error: NSError?) { 
    //code 
    //no return statement needed 
} 
Verwandte Themen