热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift中基于协议的通用树结构-Generic,Protocol-basedTreeStructureinSwift

Ivebeenlookingatsomecodeexamplesfromanotherlanguage(Haskell&C#tobespecific),and

I've been looking at some code examples from another language (Haskell & C# to be specific), and I'm having an issue coming up with a Swift equivalent.

我一直在研究另一种语言的一些代码示例(Haskell和C#是具体的),而我遇到了一个与Swift等价的问题。

From the Haskell definition, we have:

根据Haskell定义,我们有:

data Tr a = Lf a | Br (Tr a) (Tr a)

From C#, we have:

从C#开始,我们有:

public abstract class Tr { }

public class Lf : Tr {
    public a contents { get; set; }
}

public class Br : Tr {
    public Tr left { get; set; }
    public Tr right { get; set; }
}

So a Tree is either a Leaf with a content of a generic type, or a Branch with a left & right Tree.

因此,Tree可以是具有泛型类型内容的Leaf,也可以是具有左右树的分支。

I'm bumping up against the type system in Swift, so I'm not sure what the appropriate form should be. I have:

我碰到了Swift中的类型系统,所以我不确定应该采用什么样的形式。我有:

protocol Tree {
    associatedtype Element: CustomStringConvertible
}

struct Leaf: Tree {
    typealias Element = LeafElement
    let content: Element
}

struct Branch: Tree {
    typealias Element = BranchElement
    let left: Tree
    let right: Tree
}

At this point, the above is many iterations of banging my head against the wall, so it's probably way off at this point. Leaf seems to be fine, but Branch fails with

在这一点上,上面是我的头撞墙的许多次迭代,所以在这一点上它可能已经过时了。 Leaf看起来很好,但Branch失败了

Protocol 'Tree' can only be used as a generic constraint because it has Self or associated type requirements

And recommendations would be appreciated.

建议将不胜感激。

1 个解决方案


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文涉及源码版本为2.6.9准备工作down一份Vue源码,从package.json入手,找我们需要的代码1、package.json中的scripts,build:nodesc ... [详细]
  • 在最近的一系列文章,对midipadAPP,有一个关于一个radialgradiant渲染每个padview利用的探讨,对审美的原因&#x ... [详细]
  • PostgreSQL的upsert实例操作(insert
    建表语句:DROPTABLEIFEXISTSgoods;CREATETABLEgoods(store_cdint4NOTNULL,good_cdvarchar(50 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Matlab 中的一些小技巧(2)
    1.Ctrl+D打开子程序  在MATLAB的Editor中,将输入光标放到一个子程序名称中间,然后按Ctrl+D可以打开该子函数的m文件。当然这个子程序要在路径列表中(或在当前工作路径中)。实际上 ... [详细]
  • 网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linu ... [详细]
author-avatar
爱夫777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有