2015-06-21 67 views
11

我試圖在Swift 2中試驗遞歸枚舉,但是出現編譯錯誤。如何用Swift 2.0聲明遞歸枚舉

我開始試圖定義我自己的例子:

enum Tree { 
    case Empty 
    indirect case Node(value: Int, left: Tree, right: Tree) 
} 

但得到一個錯誤:「在一條線上連續聲明必須由分開」。

所以,我試圖從他們的WWDC15 什麼斯威夫特演示文稿的新蘋果自己的例子:

enum Tree<T> { 
    case Leaf(T) 
    indirect case Node(Tree, Tree) 
} 

但與此也同樣編譯錯誤。如果我創建了一個新的遊樂場並粘貼這些行,那麼會導致錯誤 - 請參閱截圖,或者如果在Xcode項目中使用相同的東西,請參閱其他截圖。

我正在使用Xcode 7.0。

爲什麼我連蘋果的例子都無法編譯?

Enums and cases can be marked indirect, which causes the associated value for the enum to be stored indirectly, allowing for recursive data structures to be defined.

下面的代碼工作在一個遊樂場:

enter image description here enter image description here

+4

如果我沒記錯的話,他們說,這是未來,但現在還沒有 – Juan

+4

權,在談話Lattner提到,「間接」關鍵字沒有進入Beta 1(但即將推出) – fqdn

回答

16

按照release notes,在Xcode 7的β4,其中指出的溶液中加入對這種支持

enum Tree { 
    case Empty 
    indirect case Node(value: Int, left: Tree, right: Tree) 
} 

let tree1 = Tree.Node(value: 0, left: Tree.Empty, right: Tree.Empty) 
let tree2 = Tree.Node(value: 0, left: Tree.Node(value: -1, Tree.Empty, Tree.Empty), right: Tree.Empty) 

有趣的是,試圖使用枚舉與switch工作正常,埠使用新的Swift 2 if case語法反覆使Xcode崩潰並使Playground無法使用。我不確定這是專門針對枚舉還是隻是一般的beta不穩定。


背景:

在這個問題最初提出的時候和這個答案接受,Xcode的β1的是最新版本。 Xcode的7β1的-β3不支持這一點,他們的發行說明包含以下空話:

「indirect」 enum elements are not yet implemented yet in this beta, they will be added in a later update.

+0

感謝您對Xcode 7 beta 2的更新。對此感到疑惑。 –

+0

是否有可能獲得給定節點的父項? – user965972

+0

不一樣。我想你可以給Node添加一個'parent'成員,如果你讓它變成可變的,但是這對我來說感覺很奇怪。請參閱關於在Haskell中實現雙向鏈表的討論,這是一個類似的問題:http://stackoverflow.com/questions/10386616/how-to-implement-doubly-linked-lists - 如果你正在處理一個'在遞歸之前,你應該有一個對父節點和子節點的引用,所以你可能只需要改變你的算法。如果您需要更充分的討論,請嘗試發佈問題。 – Brett