2016-04-20 3 views
0

У меня есть класс Response, содержащий значение, и у меня также есть класс Value, содержащий данные, которые соответствуют протоколу Mappable.Тип swift вложенных генериков не соответствует протоколу

Теперь у меня есть функция для обработки объекта Response, но пока я пытаюсь получить данные из объекта Value, он показывает, что тип «R» не соответствует протоколу.

Это мой код в детскую площадку:

Update

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) 
}) 

Могу ли я делать это правильно? Или любой другой способ добиться этого. Thanks

ответ

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 соответствуют протоколу, поэтому, пока я получаю доступ к данным в generics T, я предполагаю, что мой R просто AnyObject. – desmond0321

0

Хех, доступ к response.value в handleResponse() - функция на самом деле сбой компилятора, то есть ошибка в компиляторе. Я переписал ваш код, поэтому он компилируется:

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 способным обрабатывать любые сопоставимые данные, я обновляю свой код, надеюсь, что это может сказать больше, чего я пытаюсь достичь. – desmond0321

Смежные вопросы