Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何解决;协议只能用作一般约束…“;_Swift_Protocols - Fatal编程技术网

Swift 如何解决;协议只能用作一般约束…“;

Swift 如何解决;协议只能用作一般约束…“;,swift,protocols,Swift,Protocols,考虑以下代码片段: public protocol Evaluable { typealias ReturnType func eval(s: State) -> ReturnType } protocol AlgebraicExpr : Evaluable { } public struct Const : AlgebraicExpr { var value: Int = 0 public func eval(s: State) -> Int

考虑以下代码片段:

public protocol Evaluable {
    typealias ReturnType
    func eval(s: State) -> ReturnType
}

protocol AlgebraicExpr : Evaluable {
}

public struct Const : AlgebraicExpr {
    var value: Int = 0

    public func eval(s: State) -> Int {
        return value
    }
}

public struct Add : AlgebraicExpr {
    let a, b: AlgebraicExpr

    public func eval(s: State) -> Int {
        return a.eval() + b.eval()
    }
}
它无效,因为
Add
不能有
AlgebraicExpr
变量

但是我真的需要
Add
来存储两个
AlgebraicExpr
s。您将如何在Swift中解决此问题

为完整起见,
State
只是一个结构,例如:

public struct State {
    var env = Dictionary<String, Int>()

    init(_ d: Dictionary<String, Int> = [:]) {
        env = d
    }

    subscript(s: String) -> Int? {
        get {return env[s]}
        set {env[s] = newValue}
    }
}
公共结构状态{
var env=字典()
init(d:Dictionary=[:]){
环境=d
}
下标(s:String)->Int{
获取{return env[s]}
集合{env[s]=newValue}
}
}

不能存储依赖于
Self
typealias
的两个协议,因为当抽象为协议时,功能是不确定的。如果不了解返回类型的值,则类型可评估的就没有实际意义,因此系统不可能逻辑运行并理解应该返回的内容

例如,类似这样的内容(无效)

返回类型不能仅通过协议推断,它需要一个指定类型的实现,通过定义
typealias ReturnType

这些约束可以用作泛型约束的原因是可以通过泛型参数推断实现

func genericConstrained<T: Evaluable>(evaluable: T, state: State) -> T.ReturnType {
    return evaluable.eval(state)
}
然后使用like

let add: Add<SomeConformingType> = ...
let add:add=。。。

不能存储依赖于
Self
typealias
的两个协议,因为当抽象为协议时,功能是不确定的。如果不了解返回类型的值,则类型可评估的就没有实际意义,因此系统不可能逻辑运行并理解应该返回的内容

例如,类似这样的内容(无效)

返回类型不能仅通过协议推断,它需要一个指定类型的实现,通过定义
typealias ReturnType

这些约束可以用作泛型约束的原因是可以通过泛型参数推断实现

func genericConstrained<T: Evaluable>(evaluable: T, state: State) -> T.ReturnType {
    return evaluable.eval(state)
}
然后使用like

let add: Add<SomeConformingType> = ...
let add:add=。。。

上面的
状态是什么?
请向我们展示一个有效且可验证的示例(因此包括
状态
的一些最低版本),它帮助我们(尝试)帮助您。添加了
状态
的实现我添加了一种
添加
的方法来包含对象,但是它是通过编辑并想告诉你上面的
状态
是什么?请给我们展示一个工作且可验证的示例(因此包括
状态
的一些最小版本),它帮助我们(尝试)帮助你。添加了
状态
的实现我添加了一种
添加
的方法来包含对象,但是,通过编辑它,并希望ping你