Swift协议ANY闭包类型



所以我试着做我自己的快速"评估";函数,我的方法是做一些接受操作符的类,然后当你提交一个操作字符串时,它可以将它eval成另一种类型。我的第一步是创建一个操作符类,这样就可以存储操作符了。我的方法是创建一个操作符协议,该协议要求操作符的字符串表示,例如:"++"(以便在计算字符串时可以识别操作符),以及一个名为operation的函数,该函数实际执行操作以下是我制定的协议:

protocol Operator {
associatedtype returnType
var id: String { get }
var operate: (_ item: returnType) -> returnType { get }
}

然后,我继续做了一个符合Operator的结构,像这样:

struct PrefixOperator<T>: Operator {
var id: String
var operate: (_ item: T) -> T
}

按预期工作,然而,当我移动到一个中缀操作符,操作两个元素(例如:5 - 3是"-";是运算符)

struct InfixOperator<T>: Operator {
var id: String
var operate: (_ left: T, _right: T)
}

我得到一个错误消息,说它不符合协议。我理解为什么不能,我认为解决方案是让协议要求任何闭包——让我告诉你我的意思:

protocol Operator {
associatedtype returnType
var id: String { get }
var operate: AnyClosure { get }
}

然而,通过查看文档,我找不到表示任何类型闭包的类型我寻找的答案是,如果这样的事情存在,如果它不存在,我真的很感激进一步的指导,也许是一个提示,从别人我怎么能做得不同。

感谢您的宝贵时间。

您可以在协议

中使用associatedtype定义AnyClosure
protocol Operator {
associatedtype AnyClosure
var id: String { get }
var operate: AnyClosure { get }
}
protocol UnaryOperator: Operator {
associatedtype returnType
var id: String { get }
var operate: (_ item: returnType) -> returnType { get }
}
protocol BinaryOperator: Operator {
associatedtype returnType
var id: String { get }
var operate: (_ left: returnType, _ right: returnType) -> returnType { get }
}
struct PrefixOperator<T>: UnaryOperator {
var id: String
var operate: (_ item: T) -> T
}
struct InfixOperator<T>: BinaryOperator {
var id: String
var operate: (_ left: T, _ right: T) -> T
}

protocol Operator {
associatedtype AnyClosure
var id: String { get }
var operate: AnyClosure { get }
}
struct PrefixOperator<T>: Operator {
var id: String
var operate: (_ item: T) -> T
}
struct InfixOperator<T>: Operator {
var id: String
var operate: (_ left: T, _ right: T) -> T
}

我希望它会有用。

相关内容

最新更新