2014-10-13 2 views
6

Повреждения игровой площадки Xcode для этого кода - если в проекте это предотвращает компиляцию.Игровые площадки для рекурсивного значения Тип

Я пытаюсь объявить только очень простой:

-структуру
struct Node<T> { 
    let value: T 
    var next: Node<T>? 

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

Если я что в XCode детской площадке я получаю следующее сообщение об ошибке: Связь с услугой детской площадки была прервана неожиданно.

Если я объявляю эту структуру в отдельном файле в XCode, проект не может быть скомпилирован. Все, что я получаю, в этом случае Ошибка команды из-за сигнала: Ошибка сегментации: 11.

Может ли кто-нибудь помочь мне с этим? Есть ли обходной путь? Любая помощь очень ценится.

+1

В площадке Xcode 6.1 (6A1046a) я получаю: 'Рекурсивного типа значения 'Узел ' не allowed'. Кажется, это работает, если вы используете 'class' вместо' struct'. –

+1

Укажите, какую версию xcode вы используете на свой вопрос. –

+1

@ Черная лягушка XCode 6.0 (6A313). Похоже, мне действительно нужно обновить – drasto

ответ

2

Цитирование быстрой документации: «Структуры всегда копируются, когда они передаются в вашем коде, и не используют подсчет ссылок». [1]

Связанный список, который вы пытаетесь достичь, путем сохранения указателя или ссылки на следующий узел на текущем узле. Таким образом, каждый узел имеет одинаковый размер. С другой стороны, структура Swift не является ссылочным типом. Размер каждого узла будет отличаться в зависимости от того, сколько узлов он должен хранить рекурсивно.

Один из способов добиться того, что вы пытаетесь сделать со структурой, - использовать UnsafeMutablePointer. Мне не нужно предупреждать вас, потому что это быстро, заставляет вас писать «небезопасно» каждые несколько строк.

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