2016-04-20 95 views
0

我有一個Response類包含一個值,並且我也有一個Value類包含符合Mappable協議的數據。Swift嵌套泛型類型不符合協議

現在我有一個函數來處理Response對象,但是當我試圖從Value對象中獲取數據時,它顯示類型「R」不符合協議。

這是我在操場代碼:

更新

protocol Mappable{ 
    func doSomething() 
} 

class User: Mappable { 
    func doSomething() { 

    } 
} 

class Book: Mappable { 
    func doSomething() { 

    } 
} 

class Value<T: Mappable>: Mappable{ 
    var data: T? 

    func doSomething() { 

    } 
} 

class Response<T>{ 
    var value: T? 
} 

func handleResponse< R: Mappable, T:Value<R>>(response:Response<T>, completeHandler: (R?, NSError?)->()){ 
    completeHandler(response.value!.data, nil) //error goes here: Type "R" does not conform to protocol Mappable 

} 


let response = Response<Value<User>>() 
response.value = Value<User>() 
response.value?.data = User() 

let response2 = Response<Value<Book>>() 
response2.value = Value<Book>() 
response2.value?.data = Book() 

handleResponse(response, completeHandler:{(r,e)in 
    print(r) 
}) 

handleResponse(response2, completeHandler:{(r,e)in 
    print(r) 
}) 

我這樣做對嗎?或者以任何其他方式來實現這一點。 謝謝

回答

2

我不確定你的代碼爲什麼不起作用。我認爲這是因爲Swift在泛型中推斷泛型的類型時遇到困難。

我設法通過包裝response類型本身來編譯它,而不是爲Value<R>定義新的通用類型。例如:

func handleResponse<R: Mappable>(response:Response<Value<R>>, completeHandler: (R?, NSError?)->()){ 
    completeHandler(response.value!.data, nil) 
} 

我想知道是否有其他人知道到底爲什麼您的原始代碼不工作,但!

+0

是的,定義這樣的功能將起作用。謝謝。 – desmond0321

+0

我懷疑編譯時,它實際上並不知道我的泛型R符合協議,所以當我訪問泛型T中的數據時,它假設我的R只是一個AnyObject。 – desmond0321

0

heh,訪問handleResponse()函數中的response.value - 函數實際上會崩潰編譯器,這肯定是編譯器中的錯誤。我重寫了你的代碼,所以它編譯:

import Foundation 

protocol Mappable { 
    func doSomething() 
} 

class User: Mappable { 
    func doSomething() { 

    } 
} 

class Value<T: Mappable>: Mappable { 
    var data: T? 

    func doSomething() { 

    } 
} 

class Response<T> { 
    var value: T? 
} 

func handleResponse< T:Value<User>>(response:Response<T>, completeHandler: (User?, NSError?)->()) 
{ 
    completeHandler(response.value!.data, nil) 
} 


let response = Response<Value<User>>() 
response.value = Value<User>() 
response.value?.data = User() 


handleResponse(response, completeHandler:{(r,e) in 
    print(r) 
}) 
+0

感謝您的回覆。其實我想要做的是讓handleResponse能夠處理任何Mappable數據,我已經更新了我的代碼,希望這可以告訴更多我試圖實現的內容。 – desmond0321

相關問題