不能將類型爲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)
}
看看這個!它可以幫助你! http://stackoverflow.com/questions/28778010/swift-selectors-and-closures-discussion – txaidw 2015-04-19 17:06:27