2014-09-19 64 views
5

只是写了一个简单的快速应用程序,这个错误出现了。Swift:关闭作为参数报告错误

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 '()' 
} 

但是当我插入let语句,一切正常。任何线索怎么回事?

回答

3

问题是,当没有显式返回时,闭包会自动返回。在这种情况下,返回值为Void?,因为存在可选的链接。您可以通过返回的最后一条语句解决这个问题:

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

或使testClosure返回Void?

class Form { 
    var delegate: FormDelegate? 

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

这很有意义。现在即使是错误消息也是有道理的。谢谢:) – warly 2014-09-19 11:39:18

+0

哇,这很有趣。从概念的角度来看,'虚空'与'虚空'有什么不同?可以? – 2014-09-19 11:51:34

+0

'Void?'是可选的,就像'Int?'等等......它可以是'无(None)'或'Void(Some)'。它主要用在可选的链接方法调用中,以告诉方法是否返回曾经调用过的'Void'。 – Kirsteins 2014-09-19 11:58:27

1

如果关闭一个表达式迅速试图返回expreeions结果。很快就会有关于此功能(或错误?)的博客文章。 link