首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >任何闭包类型的Swift协议

任何闭包类型的Swift协议
EN

Stack Overflow用户
提问于 2022-06-20 13:09:40
回答 1查看 46关注 0票数 1

所以我试着做我自己的快速" eval“函数,我的方法是做一些接受操作符的类,然后当您提交一个字符串操作时,它可以把它转换成另一种类型。我的第一步是创建一个操作符类,这样我就可以存储操作符。我的方法是创建一个操作符协议,它需要操作符的字符串表示,例如:"++“(以便在计算字符串时可以识别该运算符),而在这里实际执行操作的一个函数是我制定的协议:

代码语言:javascript
运行
复制
protocol Operator {
    associatedtype returnType
    var id: String { get }
    var operate: (_ item: returnType) -> returnType { get }
}

然后,我做了一个符合操作符的结构,如下所示:

代码语言:javascript
运行
复制
struct PrefixOperator<T>: Operator {
    var id: String
    var operate: (_ item: T) -> T
}

但是,当我移动到一个infix操作符,该操作符对两个元素进行操作时(例如:5-3 make "-“是操作符)。

代码语言:javascript
运行
复制
struct InfixOperator<T>: Operator {
    var id: String
    var operate: (_ left: T, _right: T)
}

我收到一条错误消息,说它不符合协议。我理解为什么它没有,我认为解决办法是使协议需要任何关闭--让我向你展示一下我的意思:

代码语言:javascript
运行
复制
protocol Operator {
    associatedtype returnType
    var id: String { get }
    var operate: AnyClosure { get }
}

然而,纵观这些文档,我找不到一种能代表任何类型的闭包的类型,我想要的答案是,如果这样的事情存在,如果不存在,我真的很希望得到进一步的指导,也许是来自某个人关于我如何以不同的方式来做这件事的建议。

谢谢您抽时间见我。

EN

回答 1

Stack Overflow用户

发布于 2022-06-20 13:32:04

您可以在协议中使用关联类型定义AnyClosure。

代码语言:javascript
运行
复制
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
}

代码语言:javascript
运行
复制
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
}

我希望这是有用的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72687566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档