2016-07-30 94 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") 
相關問題