swift - 如何创建返回通用协议(protocol)类型的函数?

标签 swift

在下面的代码中,我有一个通用协议(protocol) Var,它有一个私有(private)实现类 LambdaVar。现在我想要一个函数返回 LambdaVar 的实例而不公开公开它。

但我找不到定义返回通用协议(protocol)类型的函数的方法。

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> {

最佳答案

您应该创建 Var 的简单包装类型喜欢 SequenceOf<T> :

struct VarOf<T>:Var {
    let f:Void->T
    init<V:Var where V.ValueType == T>(_ v:V) {
        f = { v.value }
    }
    var value:T {
        return f()
    }
}

func transform<T : Var, U>(v : T, f : T.ValueType -> U) -> VarOf<U> {
    return VarOf(LambdaVar<U>({ f(v.value) }))
}

let intVar = VarOf(LambdaVar({ 12 }))
let floatVar = transform(intVar, { Float($0) })
floatVar.value // -> 12.0

关于swift - 如何创建返回通用协议(protocol)类型的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484499/

相关文章:

ios - 快速播放和停止音乐

swift - 将大于的可视格式语言转换为约束

ios - 如何在 Swift 中将日期转换为字符串

swift - GMSMarker 渲染和滞后问题

swift - 归档项目卡了几个小时

iOS场景包: rotate node to look at another node

swift - 使用操作获取 CLLocation 数据

swift - 尝试为我的 swift sprite kit 游戏添加关卡

swift - CoreData 使用 iCloud,不使用同步通知

ios - XCode 7 和 Swift 混淆