2016-04-20 7 views
0

Ich habe eine Antwort-Klasse einen Wert enthalten, und ich habe auch eine Value-Klasse enthalten Daten, die Mappable-Protokoll entsprechen.Swift verschachtelte Generika Typ entspricht nicht dem Protokoll

Jetzt habe ich eine Funktion, um Response-Objekt zu behandeln, aber während ich versuche, die Daten aus Value-Objekt zu bekommen, zeigt es Typ "R" nicht protokollkonform.

Dies ist mein Code auf dem Spielplatz:

aktualisieren

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

Bin ich es richtig zu machen? Oder eine andere Möglichkeit, dies zu erreichen. Danke

Antwort

2

Ich bin nicht wirklich sicher, warum Ihr Code nicht funktioniert. Ich nehme an, dass Swift Schwierigkeiten hat, den Typ eines Generikums in einem Generikum abzuleiten.

Ich schaffte es, es zu kompilieren, indem Sie den response Typ selbst einwickeln, anstatt ein neues generisches für Value<R> zu definieren. Zum Beispiel:

Ich würde gerne wissen, ob jemand anderes genau weiß, warum Ihr ursprünglicher Code nicht funktioniert!

+0

Ja, definieren Sie die Funktion wie diese funktioniert. Vielen Dank. – desmond0321

+0

Ich vermute beim Kompilieren, es wusste eigentlich nicht meine Generika R hat das Protokoll konform, also während ich auf Daten in Generika T zugreife, nehme ich an, dass mein R nur ein AnyObject ist. – desmond0321

0

Heh, Zugriff auf response.value in der handleResponse() - Funktion tatsächlich stürzt den Compiler, das ist ein Fehler im Compiler sicher. Ich habe Ihren Code umgeschrieben, also kompiliert er:

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

Danke für die Antwort. Eigentlich versuche ich, handleResponse in der Lage zu sein, alle mappbaren Daten zu verarbeiten, ich habe meinen Code aktualisiert, hoffe, das kann mehr erzählen, was ich versuche zu erreichen. – desmond0321