协议具有通用功能和associatedType
问题描述:
我有下面的代码:协议具有通用功能和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'
答
我测试了以下码和它们编译(的XCode 7.3 - SWIFT 2.2)。在这种状态下,它们不是很有用,但我希望它能帮助你找到你需要的最终版本。
版本1
因为,Something
使用V
定义,我认为你不能只返回Something<U>
。但是你可以使用U
和V
像这样重新定义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")