2016-07-30 57 views
1

我有下面的代码:协议具有通用功能和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() 
    } 
} 

现在的问题是在Something实施next。我想返回Something<U>而不是Something<Value>

但是当我这样做时,我得到了以下错误。

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

回答

0

我测试了以下码和它们编译(的XCode 7.3 - SWIFT 2.2)。在这种状态下,它们不是很有用,但我希望它能帮助你找到你需要的最终版本。

版本1

因为,Something使用V定义,我认为你不能只返回Something<U>。但是你可以使用UV像这样重新定义Something

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

2版

或者只是使用V定义Something

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") 
相关问题