1

Ich habe den folgenden Code:Mit Protokoll generische Funktion und associatedType

protocol NextType { 
    associatedtype Value 
    associatedtype NextResult 

    var value: Value? { get } 

    func next<U>(param: U) -> NextResult 
} 

struct Something<Value>: NextType { 

    var value: Value? 

    func next<U>(param: U) -> Something<Value> { 
     return Something() 
    } 
} 

Nun ist das Problem in der Something Implementierung von next. Ich möchte Something<U> anstelle von Something<Value> zurückgeben.

Aber wenn ich das tue, habe ich den folgenden Fehler.

type 'Something<Value>' does not conform to protocol 'NextType' 
protocol requires nested type 'Value' 

Antwort

0

Getestet habe ich die folgenden Codes und sie kompilieren (XCode 7.3 - Swift 2.2). In diesem Zustand sind sie nicht sehr nützlich, aber ich hoffe, dass es dir hilft, die endgültige Version zu finden, die du brauchst.

Version 1

, Da Something definiert wird V, ich glaube, Sie nicht nur Something<U> zurückkehren können. Aber Sie können Something neu definieren U und V wie folgt aus:

protocol NextType { 
    associatedtype Value 
    associatedtype NextResult 

    var value: Value? { get } 

    func next<U>(param: U) -> NextResult 
} 

struct Something<V, U>: NextType { 
    typealias Value = V 
    typealias NextResult = Something<V, U> 

    var value: Value? 

    func next<U>(param: U) -> NextResult { 
     return NextResult() 
    } 
} 

let x = Something<Int, String>() 
let y = x.value 
let z = x.next("next") 

Version 2

Oder einfach definieren SomethingV mit:

protocol NextType { 
    associatedtype Value 
    associatedtype NextResult 

    var value: Value? { get } 

    func next<U>(param: U) -> NextResult 
} 

struct Something<V>: NextType { 
    typealias Value = V 
    typealias NextResult = Something<V> 

    var value: Value? 

    func next<V>(param: V) -> NextResult { 
     return NextResult() 
    } 
} 

let x = Something<String>() 
let y = x.value 
let z = x.next("next") 
Verwandte Themen