2017-05-17 5 views
2

Bitte diese Einstellung berücksichtigen:Swift Generika-Fehler: Kann nicht Wert vom Typ ‚Typ <T>‘ umwandeln zu erwarten Argument Typ ‚Typ <_>‘

protocol MyProcotol { 
} 

class MyModel: MyProcotol { 
} 

enum Result<T> { 
    case success(value: T) 
    case failure 
} 

class Test { 
    func test<T: MyProcotol>(completion: (Result<T>) -> Void) { 
     let model = MyModel() 
     let result = Result.success(value: model) 
     completion(result) 
    } 
} 

Warum kann ich nicht completion(result) nennen? Ich erhalte diese Fehlermeldung:

Wert kann nicht vom Typ umwandeln ‚Ergebnis‘ zu erwarteten Argumenttyp ‚< Ergebnis _>‘

Jede Abhilfe?

+2

das tun ist nicht, wie Generika arbeiten sollen. Wenn Sie das 'MyModel' fest codieren, löschen Sie das generische vollständig. Was passiert, wenn Sie eine zweite Implementierung von 'MyProtocol' erstellen und diese Methode aufrufen, indem Sie' Result 'erwarten? – luk2302

Antwort

3

Sie verwenden einen nicht generischen Betontyp MyModel in einer generischen Funktion, die nicht funktioniert.

Man könnte so etwas wie dieses

class Test { 
    func test<T: MyProcotol>(item: T, completion: (Result<T>) -> Void) { 
     let result : Result<T> = .success(value: item) 
     completion(result) 
    } 
} 
Verwandte Themen