2014-12-03 55 views
3

我想創建一個在swift中使用通用閉包(塊)的函數。如何在Swift中創建通用閉包

我第一次嘗試做這樣的:

func saveWithCompletionObject(obj : AnyObject, success : AnyObject -> Void, failure : Void -> Void) 

但只要我打電話與另一個塊這個功能,如:

func doSomething(success : String -> Void, failure : Void -> Void) 
{ 
    saveWithCompletionObject("Example", success, failure) 
} 

我得到一個錯誤:'AnyObject' is not a subtype of 'String'

提前致謝!

+0

看看這個!它可以幫助你! http://stackoverflow.com/questions/28778010/swift-selectors-and-closures-discussion – txaidw 2015-04-19 17:06:27

回答

4

不能將類型爲String->Void的閉包傳遞給類型爲AnyObject->Void的參數。

但是,您可以定義一個通用功能:

func saveWithCompletionObject<T>(obj : T, success : T -> Void, failure : Void -> Void) { 
    // ... 
    success(obj) 
} 

現在,編譯器可以驗證obj具有相同類型 爲success的參數,例如:

func doSomething(success : String -> Void, failure : Void -> Void) 
{ 
    saveWithCompletionObject("Example", success, failure) 
} 

func doSomethingElse(success : Int -> Void, failure : Void -> Void) 
{ 
    saveWithCompletionObject(13, success, failure) 
} 

但我會建議saveWithCompletionObject只需要一個Void->Void 參數(沒有泛型):

func saveWithCompletionObject(success : Void -> Void, failure : Void -> Void) { 
    // ... 
    success() 
} 

呼叫者包裹它的閉合:

func doSomething(success : String -> Void, failure : Void -> Void) 
{ 
    saveWithCompletionObject({ success("Example") } , failure) 
} 

func doSomethingElse(success : Int -> Void, failure : Void -> Void) 
{ 
    saveWithCompletionObject({ success(13) }, failure) 
} 

這是更柔性的,例如對於具有多個回調函數 參數:

func andNowForSomethingCompletelyDifferent(success : (Int, Double) -> Void, failure : Void -> Void) 
{ 
    saveWithCompletionObject({ success(13, M_PI) }, failure) 
} 
+0

非常好的答案,謝謝! – allbto 2014-12-03 14:50:00