2014-10-13 9 views
6

Xcode si arresta in modo anomalo per questo codice, se nel progetto impedisce la compilazione.Il parco giochi si arresta in modo anomalo per Tipo di valore ricorsivo

sto cercando di dichiarare solo una semplice struct:

struct Node<T> { 
    let value: T 
    var next: Node<T>? 

    init(_ value: T) { 
     self.value = value 
     next = nil 
    } 
} 

Se lo faccio nel parco giochi XCode ottengo seguente messaggio di errore: La comunicazione con il servizio di parco giochi è stato interrotto in modo imprevisto.

Se dichiaro questa struttura in un file separato in XCode, il progetto non può essere compilato. Tutto ciò che ottengo è in questo caso Comando non riuscito a causa del segnale: Errore di segmentazione: 11.

Qualcuno può aiutarmi con questo? C'è una soluzione? Qualsiasi aiuto è molto apprezzato.

+1

in un parco giochi Xcode 6.1 (6A1046a) ottengo: 'valore ricorsivo tipo 'Nodo ' non è allowed'. Sembra funzionare se usi un 'class' invece di un' struct'. –

+1

Aggiungi quale versione di xcode stai usando alla tua domanda. –

+1

@Black Frog XCode 6.0 (6A313). Sembra che ho davvero bisogno di aggiornare – drasto

risposta

2

Citando la documentazione rapida, "Le strutture vengono sempre copiate quando vengono passate nel codice e non usano il conteggio dei riferimenti." [1]

Un elenco collegato che si sta tentando di ottenere funziona memorizzando un puntatore o un riferimento al nodo successivo sul nodo corrente. In questo modo, ogni nodo ha la stessa dimensione. La struttura di Swift d'altra parte non è un tipo di riferimento. La dimensione di ciascun nodo sarà diversa a seconda di quanti nodi deve memorizzare in modo ricorsivo.

Un modo per ottenere ciò che si sta cercando di fare con struct è utilizzare UnsafeMutablePointer. Non ho bisogno di avvertirti perché farlo in fretta ti fa scrivere "non sicuro" ogni poche righe.

struct Node<T> { 
    var x: T 
    // Setting pointer type to <Node<T>> compiles, but infinite loops on runtime (Swift 1.2) 
    var next: UnsafeMutablePointer<Void> 
} 

var second = Node(x: 2, next: nil) 
var first = Node(x: 1, next: &second) 

print(unsafeBitCast(first.next, UnsafeMutablePointer<Node<Int>>.self).memory.x) // Prints 2 

[1] https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html

Problemi correlati