2016-03-18 2 views
4

Почему у структур не существует рекурсивных типов значений в Swift? Является ли это временным лимитом для данного языка или как он предназначен?Swift struct type recursion

Я чувствую, что способность объявлять узел двоичного дерева как структуру с рекурсивными типами в ней является самой естественной реализацией.

struct TreeNode<E>{ 
var leftNode:TreeNode<E> 
var rightNode:TreeNode<E> 
var element:E 
} 
+2

Вы должны понимать разницу между типом ведения и тип значения сначала. То, что вы написали, невозможно на большинстве языков. Например, в C/Obj-C/C++ «leftNode» и «rightNode» должны быть указателями. В Swift, если вы хотите использовать ссылки, вы должны использовать 'class' вместо' struct'. Также обратите внимание, что вам, вероятно, понадобятся дополнительные опции. – Sulthan

ответ

8

Ответ на ваш вопрос: structs являются типами значений. Если вы включите подструктуру B в структуру A, это означает, что один объект типа A будет иметь размер sizeof(all_other_fields_of_A) + sizeof(B). Таким образом, тип значения не может быть рекурсивным: он будет иметь бесконечный размер.

+1

Только для справок в будущем: ключ понимает, какие типы значений, как объяснил @Sulthan. –

4

Перечисления в Swift поддержки рекурсивных типов с использованием indirect ключевого слова, так что вы можете сделать что-то вроде:

indirect enum Tree<T> { 

    case Node(left: Tree?, right: Tree?, element: T) 

} 

проверить это отличный блог пост A persistent tree using indirect enums in Swift

+0

Я знаю об этом методе, но его настойчивость - это то, чего я хочу избежать. –