が最初enum
を宣言し、enum
に基づくソリューションです:
enum Node
{
case leaf(Int)
case branch([Node])
}
次のようなものを書くことができます:
let x = Node.leaf(42)
let y = Node.branch([Node.leaf(42), Node.leaf(24)])
しかし、これは非常に迅速に面倒になるだろう。幸いスウィフトはリテラルからの変換を可能にするので、私たちは追加:進歩して
let x : Node = 42
let y : Node = [42, 24]
:
extension Node : ExpressibleByIntegerLiteral
{
init(integerLiteral value: Int)
{
self = .leaf(value)
}
}
extension Node : ExpressibleByArrayLiteral
{
init(arrayLiteral elements: Node...)
{
self = .branch(elements)
}
}
そして、それらは私たちが今、上記のように2つのlet
文を書くことができます追加して
。しかし、我々は
print(y)
は我々が取得する場合:
branch([Node.leaf(42), Node.leaf(24)])
をあなたはかなりあなたが追加できることを印刷したい場合:
extension Node : CustomStringConvertible
{
var description : String
{
switch self
{
case .leaf(let value):
return value.description
case .branch(let branches):
return branches.description
}
}
}
そして今print(y)
あなたが得られます。
[42, 24]
最後にあなたの例を:
let w : Node = [[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]
[[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]
あなたはなどなどisLeaf
などの述語で、enum
タイプを完了したいと思うが、それは基本的な考え方です:として出力します。
HTH
なぜツリーを定義しませんか?はるかに簡単です。 –
var test2 = [Any]() – shallowThought
@shallowThought私は何か類似していると思ったが、Anyの代わりにAnyObjectを使っていた。これは割り当て部分にはうまくいくようですが、私はオートコンプリート部分を見逃していますが、これは私が望むものです。 – andecoder