gpt4 book ai didi

swift - 如何使用自引用 Swift 协议(protocol)作为泛型类的类型

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:35 24 4
gpt4 key购买 nike

我一直在尝试使用协议(protocol)创建通用节点的链表。我知道那里有五万个链表实现。这是出于教育目的。我已经查看了 SO 的相关问题,并在 swift.org 上阅读了所有关于协议(protocol)等的内容。我在其他网站上阅读了一些关于高级用法的文章,但我仍然没有找到解决我遇到的问题的东西。

这似乎是一个微不足道的问题;也许我只是没有问正确的问题?这是精简代码:

protocol LinkableNode: class {
func getNextNode() -> LinkableNode?
}

class LinkedList<T: LinkableNode> {
var head: T?

func detach() {
head = head!.getNextNode() // The call to getNextNode() is the problem
}
}

我得到无法分配“LinkableNode”类型的值?在调用 getNextNode() 时键入“T?”。我也希望 head 成为一个节点,我认为 T: LinkableNode 会那样做,但显然不是。我已经根据我发现的几个远程相似的例子尝试了阳光下的每一种排列,但我被卡住了。

最佳答案

func getNextNode() -> LinkableNode?

定义一个方法,返回一个符合 LinkableNodesome 类型的值,但这不必与调用方法的类型相同。

你想要的是

protocol LinkableNode: class {
func getNextNode() -> Self?
}

这定义了一个返回一个(可选)值的方法,该值的类型与调用它的类型相同,并使您的剩余代码可以编译。

旁注:除非您希望您的代码在空列表上崩溃,使用可选链接而不是强制解包:

class LinkedList<T: LinkableNode> {
var head: T?

func detach() {
head = head?.getNextNode()
}
}

关于swift - 如何使用自引用 Swift 协议(protocol)作为泛型类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53028637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com