2016-11-12 8 views
1

これは私の最初の質問ですので、あまり明確でない場合は私を許してください。異なるデータ型で迅速に多目的配列を作成

配列の配列または整数のいずれかを格納する配列をswiftで作成しようとしています。 アレイ...

アレイ= [[ [2,3] ]基本的にそうようなデータ構造の樹種であるIが使用するデータの簡単な表現であると考えられます、[ 1,4 ][]]、 [][ [2,5]、[6,1] ] 、3]

を全体的なアレイでは枝や整数が葉

されている私はそう

var test2 = [[[Int]?]?]() 

または使用のtypedefのようなoptionalsとして、それらを宣言しようとしましたが、私はまだできませんそれを働かせる。

私は迅速3でworkinkingだ、と私の質問は「よく知られている」ものでなければなりません場合、私は私と一緒にその裸のiOS開発への新しいfearlyです。

[編集]また、それは配列のいずれかに新しい葉を追加することが可能でなければなりません。ここ

乾杯

+3

なぜツリーを定義しませんか?はるかに簡単です。 –

+0

var test2 = [Any]() – shallowThought

+0

@shallowThought私は何か類似していると思ったが、Anyの代わりにAnyObjectを使っていた。これは割り当て部分にはうまくいくようですが、私はオートコンプリート部分を見逃していますが、これは私が望むものです。 – andecoder

答えて

0

が最初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

関連する問題