Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:泛型结构的递归使用_Swift_Linked List - Fatal编程技术网

Swift:泛型结构的递归使用

Swift:泛型结构的递归使用,swift,linked-list,Swift,Linked List,我在Swift中使用链接列表,并使用: struct Node<Element> { var next: Node<Element>? } struct节点{ 下一步:节点? } 它会产生以下错误: Recursive value type "Node<Element>" is not allowed. 不允许递归值类型“Node”。 我尝试在struct声明和属性上使用indirect,但都不起作用。如何实现这种类型的结构?当您编写var

我在Swift中使用链接列表,并使用:

struct Node<Element> {
    var next: Node<Element>? 
}
struct节点{
下一步:节点?
}
它会产生以下错误:

Recursive value type "Node<Element>" is not allowed.
不允许递归值类型“Node”。
我尝试在struct声明和属性上使用indirect,但都不起作用。如何实现这种类型的结构?

当您编写
var next:Node?
时,Swift尝试将此存储内联,但由于它是递归的,因此会产生一个无限大的结构

indirect
仅适用于枚举,因此您可以执行以下操作:

enum Node<Element> {
    indirect case Node(Element, next: Node?)
}

Node.Node(42, next: nil)

似乎不可能创建struct的递归使用,但可以通过使用
enum
、关联值和
indirect
属性来实现

递归枚举是具有另一个实例的枚举 枚举作为一个或多个 列举个案。您指示枚举案例是递归的 通过在它之前写入间接命令,它告诉编译器插入 必要的间接层

间接枚举树{
空箱
案例节点(树、元素、树)
}

代码取自。

使用结构是不可能的。使用值类型创建链表似乎也不明智。除非你想做

head.next.next.next.next.next = head.next.next.next.next.next.next
要删除第七个节点,您需要能够设置

let next = head.next
head.next.next.next.next.next = head.next.next.next.next.next.next
let next = head.next