2016-11-12 5 views
1

это мой первый вопрос, поэтому простите меня, если это не очень понятно.Создайте многомерный массив в swift с различными типами данных

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

Array = [[[ [2, 3] ] , [ 1, 4 ], []], [], [ [2, 5], [6, 1] ] , 3]

В целом массивы ветви и целые числа являются листья

я пытался объявить их как так опциями

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

Или с помощью TYPEDEF, но я до сих пор не могу заставить его работать.

Я работаю с быстрым 3, и я боюсь нового в развитии iOS, так голый со мной, если мой вопрос должен быть «хорошо известным».

[править] Кроме того, она должна быть возможность добавлять новые листья к любому из массивов

Приветствия

+3

Почему бы вам не задать дерево? Было бы намного проще. –

+0

var test2 = [Any]() – shallowThought

+0

@shallowThought Я думал о чем-то подобном, но я использовал AnyObject вместо Any. Это, похоже, отлично работает для части задания, но, как будто, я пропускаю часть автозаполнения, это то, что я хотел. – 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)]) 

Однако это будет очень трудоемким. К счастью Swift позволяет преобразования из литералов, поэтому мы добавим:

extension Node : ExpressibleByIntegerLiteral 
{ 
    init(integerLiteral value: Int) 
    { 
     self = .leaf(value) 
    } 
} 

extension Node : ExpressibleByArrayLiteral 
{ 
    init(arrayLiteral elements: Node...) 
    { 
     self = .branch(elements) 
    } 
} 

И с тех, которые добавлены теперь мы можем написать две вышеупомянутые let заявления как:

let x : Node = 42 
let y : Node = [42, 24] 

, который лучше.Однако, если мы 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] 

Вы хотите, чтобы завершить enum типа, с предикатами, такими как isLeaf и т.д., но это основная идея.

HTH