2014-09-19 8 views
5

nur eine einfache Swift-App schreiben und dieser Fehler kam auf.Swift: Schließung als Parameter berichtet Fehler

protocol FormDelegate { 
    func formDidFinish(form: Form) 
} 

class Form { 
    var delegate: FormDelegate? 

    func testClosure(sender:() -> Void) { 
    } 
} 

let form = Form() 
form.testClosure { 
//  let removeCommentToGetRidOfError = true 
    form.delegate?.formDidFinish(form) // error: Cannot convert the expression's type '() ->() -> $T2' to type '()' 
} 

aber wenn ich die let-Anweisung einfügen, funktioniert alles. Irgendeine Ahnung, was ist los?

Antwort

3

Problem ist, dass Schließungen automatische Rückkehr haben, wenn es keine explizite Rückkehr gibt. In diesem Fall ist der Rückgabewert Void?, da eine optionale Verkettung erforderlich ist. Sie können dieses Problem beheben, indem sie als letzte Anweisung Rückkehr:

form.testClosure { 
    form.delegate?.formDidFinish(form) 
    return 
} 

oder testClosure Void?

class Form { 
    var delegate: FormDelegate? 

    func testClosure(sender:() -> Void?) { 
    } 
} 
+0

das macht viel Sinn. jetzt macht sogar die Fehlermeldung Sinn. Danke :) – warly

+0

Wow, das ist interessant. Wie unterscheidet sich "Leere" von "Leere"?, Von einem konzeptionellen Standpunkt aus? Macht es? –

+0

'Void?' Ist optional, genau wie 'Int?' Etc ... Es kann 'nil (None)' oder 'Void (Some)' sein. Es wird hauptsächlich in optionalen Aufrufmethoden für die Kettenmethode verwendet, um zu ermitteln, ob Methoden, die 'Void' zurückgeben, jemals aufgerufen wurden. – Kirsteins

1

zurückkehren machen, wenn der Verschluss einen Ausdruck swift versucht hat zurückzukehren dass expreeions führen. Es gibt einen tollen Blogbeitrag über diese Funktion (oder einen Bug?) In swift. link

Verwandte Themen