2016-05-15 3 views
1

Also habe ich ein kleines Übungsprogramm geschrieben, das mit Schließungen zu tun hat. Ich versuche besser zu verstehen, wie das asynchrone Konzept funktioniert. Wenn ich versuche, request() zu nennen, erhalte ich Konvertierungsfehler wie unten zu sehen:Aufruf einer Funktion mit einem TypeAlias ​​als Parameter?

import UIKit 

let correctPasscode = "3EyX" 

typealias CompletionHandler = (result: AnyObject?, error: String?) -> Void 

func request(passcode: String, completionHandler: CompletionHandler) { 

sendBackRequest(passcode) {(result, error) -> Void in 
    if error != nil { 
     print(error) 
    } 
    else { 
     print(result) 

    }} 

} 

func sendBackRequest(passCode: String, completionHandler: CompletionHandler) { 
if passCode == correctPasscode { 
    completionHandler(result: "Correct. Please proceed", error: nil) 

} else { 
    completionHandler(result: nil, error: "There was an error signing in") 

} 
} 


request(correctPasscode, completionHandler: CompletionHandler) // Error happens here 

enter image description here

+0

Bitte teilen Sie Ihren Code, kein Bild davon –

+0

Sorry, dass nur die Änderungen vorgenommen. –

Antwort

3

Typ alias gibt es zu sagen, was tatsächlichen Typ, den Sie übergeben müssen. In diesem Fall ist die Art ein Verschluss vom Typ

(result: AnyObject?, error: String?) -> Void 

Sie geben es wie folgt aus:

request(correctPasscode, completionHandler:{ 
    (result: AnyObject?, error: String?) in 
    print("Inside the handler...") 
    // Do some useful things here 
}) 

oder noch kürzer -

request(correctPasscode) { 
    (result: AnyObject?, error: String?) in 
    print("Inside the handler...") 
    // Do some useful things here 
} 

oder noch kürzer - (die Typen sind über die Funkdeklaration bekannt) -

request(correctPasscode) { result, error in 
    print("Inside the handler...") 
    // Do some useful things here 
} 
+0

Oder einfach kann den 'completionHandler' Parameter im Aufruf der abschließenden Schließung weglassen. –

+0

@VictorSigler Richtig. Vielen Dank! – dasblinkenlight

+0

Ich bekomme einen Fehler, wenn ich versuche, eine Anfrage zu starten, um das zu tun, was das Programm tun soll. Fehler: Aufeinander folgende Anweisungen in einer Zeile müssen durch ';' getrennt sein. Ich habe den Code, den Sie mir gegeben haben, kopiert und eingefügt, um meine Parameter in request() zu übergeben. Vielleicht verstehe ich die Art und Weise, wie Schließungen funktionieren, falsch? –

1

Ich bin nicht sicher, was Sie zu erreichen versuchen, aber diese Linie:

request(correctPasscode, completionHandler: CompletionHandler) 

nicht kompiliert, da Sie kein CompletionHandler Schließung auf die Funktion, sondern ein Typ Objekt repräsentiert den Typ sind vorbei dieses Abschlussbehandlers.

Daher der Fehler: Cannot convert value of 'CompletionHandler.*Type*'.

würde ein gültiger Aufruf sein:

request(correctPasscode) { result, error in 
    print("result was \(result), and error was \(error)") 
} 

Aber dann request Funktion nichts mit der Schließung tun, die in vergangen ist es ein wenig schwer zu sagen, was Sie wollen ...

.
+0

Sorry für die Mehrdeutigkeit. Ich sende nur diesen "Korrekten Passcode" an diese Funktion sendBackRequest, um mich wissen zu lassen, ob der Passcode richtig war oder nicht (ich habe ihn zum richtigen Passcode gemacht, weil ich ihm eine Variable zugewiesen habe, die ich übergeben habe). –

+0

Ich kann das sehen, aber warum wickeln Sie 'sendBackRequest' in eine weitere' request' Funktion? Sie übergeben bereits eine Schließung an 'sendBackRequest' in' request'.Was ist der Zweck des (unbenutzten) 'completionHandler'-Arguments von' request'? – hnh

Verwandte Themen