2014-09-19 71 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