2016-03-29 31 views
2

私はスウィフトにリンクされたリストで遊んだし、私が使用している:スウィフト:一般的な構造体の再帰的使用

struct Node<Element> { 
    var next: Node<Element>? 
} 

が、それはこのエラーを得られます。

Recursive value type "Node<Element>" is not allowed. 

私は間接的な使用してみました構造体の宣言とプロパティの両方がどちらも機能しませんでした。どのようにこのタイプの構造を実装していますか?

答えて

3

var next: Node<Element>?と書くと、Swiftはこのストレージをインラインにしようとしますが、再帰的なので、結果として無限のサイズの構造体になります。

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

Node.Node(42, next: nil) 

それとも、通常の参照型、別名class使用することができます:

class Node<Element> { 
    var next: Node<Element>? 
} 
2

をそれが不可能であると思われる

indirectは、あなたがこのような何かを行うことができますので、列挙型に適用されます構造体の再帰的な使用を作成するには、enum、関連付けられた値とindirect属性を使用して行うことができます。

A recursive enumeration is an enumeration that has another instance of the enumeration as the associated value for one or more of the enumeration cases. You indicate that an enumeration case is recursive by writing indirect before it, which tells the compiler to insert the necessary layer of indirection.

indirect enum Tree<Element: Comparable> { 
    case Empty 
    case Node(Tree<Element>,Element,Tree<Element>) 
} 

AirspeedVelocityから取られたコード。

0

Structでは不可能です。また、リンクされたリストを値型で行うのは賢明ではないようです。あなたは第7ノードを削除する

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

をしているように感じていない限り、あなたが設定できるようにしたいとしている

let next = head.next 
関連する問題