所以我试着做我自己的快速" eval“函数,我的方法是做一些接受操作符的类,然后当您提交一个字符串操作时,它可以把它转换成另一种类型。我的第一步是创建一个操作符类,这样我就可以存储操作符。我的方法是创建一个操作符协议,它需要操作符的字符串表示,例如:"++“(以便在计算字符串时可以识别该运算符),而在这里实际执行操作的一个函数是我制定的协议:
protocol Operator {
associatedtype returnType
var id: String { get }
var operate: (_ item: returnType) -> returnType { get }
}然后,我做了一个符合操作符的结构,如下所示:
struct PrefixOperator<T>: Operator {
var id: String
var operate: (_ item: T) -> T
}但是,当我移动到一个infix操作符,该操作符对两个元素进行操作时(例如:5-3 make "-“是操作符)。
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 }
}然而,纵观这些文档,我找不到一种能代表任何类型的闭包的类型,我想要的答案是,如果这样的事情存在,如果不存在,我真的很希望得到进一步的指导,也许是来自某个人关于我如何以不同的方式来做这件事的建议。
谢谢您抽时间见我。
发布于 2022-06-20 13:32:04
您可以在协议中使用关联类型定义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
}我希望这是有用的
https://stackoverflow.com/questions/72687566
复制相似问题