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你