2016-03-29 22 views
2

Ben Swift bağlantılı listeleri ile oynamak ve ben kullanıyorum Yinelemeli kullanım:Swift: jenerik yapı

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

I dolaylı kullanarak çalıştı:

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

bu hatayı verir hem struct declaration hem de özellik ama ne işe yaramadı. Bu tür bir yapıyı nasıl uygularsınız?

cevap

3

var next: Node<Element>? yazdığınızda, Swift bu depolamayı satır içi olarak kullanmaya çalışır, ancak yinelemeli olduğundan, sonsuz boyutta bir yapıyla sonuçlanır.

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

Node.Node(42, next: nil) 

Yoksa kullanabilirsiniz düzenli referans türü, nam class:

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

Öyle görünüyor ki mümkün değildir böyle bir şey yapabileceğini böylece

indirect sadece çeteleler için geçerlidir struct'in yinelemeli kullanımını oluşturmak için, enum, ilişkili değerler ve indirect özniteliğini kullanarak yapabilirsiniz.

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>) 
} 

Kod AirspeedVelocity alınan.

0

Yapılar ile mümkün değil. Ayrıca, değer türleri ile bağlantılı liste yapmak akıllıca görünmüyor. Eğer yedinci düğümü silmek için

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

yapıyor gibi hissediyorum sürece, ayarlamak mümkün istiyorum gidiyoruz

let next = head.next