2014-11-08 60 views
2

我想在一個快速項目中實現一個回調,就像我在Objective-C中做的那樣我需要一個類型爲closure的變量。該閉包應該將參數作爲一個對象並且不返回任何內容。快速關閉作爲變量存儲和訪問

var downloadCompleted: (MLBook) -> (Void)! 

當我需要觸發回調我這樣做:

if self.downloadCompleted { 
    self.downloadCompleted(book) 
} 

編譯器與此錯誤消息抱怨:

Type '(MLBook) -> (Void)!' does not conform to protocol 'BooleanType' 

如果我刪除if語句編譯器說:

Property 'self.downloadCompleted' not initialized 

偶數儘管它隱含地解開了。

當我試圖讓回調:

BookStore.sharedInstance.downloadCompleted{(book: MLBook) ->() in 
    println("Print if you got the callback") 
} 

我收到此錯誤信息:

'(MLBook) ->()' is not convertible to 'MLBook' 

我更擔心的是最後一條錯誤消息,因爲我不太清楚是什麼它試圖告訴我。

任何幫助,將不勝感激。謝謝

回答

4

這是您的工作示例。附件中說明了一些錯誤。注意 我有download()方法返回Bool,以便可以在此屏幕截圖中看到結果。

enter image description here

但是,您使用的隱含展開可選(又名 '!')不正確。當值爲nil時會使用這種可選項,但將在已知時間分配並且不會更改(請參閱Apple文檔以獲取說明)。你的downloadCompleted是一個真正的可選(至少在你的例子中使用)。因此,更好的代碼,這原來是稍微簡單的是:

enter image description here

1

2錯誤。 1,整個類型應該包裹在()中,然後跟着一個?要麼 !作爲可選或隱含的解包可選。第二,你應該檢查無,在迅速,沒有隱式布爾轉換。

在你的用例中,你應該使用Optional來代替Implicit unwrapped。因爲你的財產很可能沒有價值。使用IUO(Implicit unwrapped optional),您可以跳過編譯器警告,並會得到運行時錯誤。

import Foundation 

class MLBook { 
    var name = "name" 
} 

class A { 
    var downloadCompleted: ((MLBook) -> Void)? 

    func down(){ 
     var book = MLBook() 
     if let cb = self.downloadCompleted { 
      cb(book) 
     } 
    } 
} 

var a = A() 
a.downloadCompleted = { 
    (book: MLBook) -> Void in 
    println(book.name) 
} 

a.down() 
+0

感謝。這就說得通了。但是當我嘗試獲取回調BookStore.sharedInstance.downloadCompleted {(book:MLBook) - > Void println(「Haha:」) }我得到一個錯誤:無法用類型爲'(')的參數調用'println' MLBook) - >虛空'。我很確定我沒有說得對。任何想法爲什麼? – alex 2014-11-08 12:11:34

+0

我想你錯過了將封閉分配給屬性的「=」。 – Shuo 2014-11-08 12:14:04