【发布时间】:2014-10-21 10:29:24
【问题描述】:
在下面的代码中,我有一个通用协议Var,它有一个私有实现类LambdaVar。现在我想要一个函数来返回 LambdaVar 的一个实例而不公开它。
但我找不到定义返回通用协议类型的函数的方法。
public protocol Var {
typealias ValueType
var value : ValueType { get }
}
struct LambdaVar<T> : Var {
let _get : Void -> T
init(_ f : Void -> T)
{
_get = f
}
var value : T {
get {
return _get()
}
}
}
public func transform<T : Var, U>(v : T, f : T.ValueType -> U) -> Var<U> {
return LambdaVar<U>() { f(v.value) } // ^^^^^^ what to put here?
}
错误:
Playground execution failed: <EXPR>:26:67: error: cannot specialize non-generic type 'Var'
public func transform<T : Var, U>(v : T, f : T.ValueType -> U) -> Var<U> {
^
<EXPR>:26:67: error: protocol 'Var' can only be used as a generic constraint because it has Self or associated type requirements
public func transform<T : Var, U>(v : T, f : T.ValueType -> U) -> Var<U> {
【问题讨论】:
-
我认为您想要实现的目标在 swift 中是不可行的 - 请参阅 this answer。具有泛型的协议不能用作具体类型
标签: swift