使用不同的数据类型在swift中创建多维数组

时间:2016-11-12 18:41:25

标签: ios xcode tree swift3 dynamic-arrays

这是我的第一个问题,请原谅我,如果不是很清楚的话。

我正在尝试在swift中创建一个存储数组数组或整数的数组。 该数组应该是我将使用的数据的简单表示,它基本上是一种树类数据结构,如此......

数组= [[ [ [2,3] ] [ 1,4 ] ,< strong> [ 2 ] ],            [ 2 ] [ [2,5],[6,1] ] ,3]

总的来说,数组是分支,整数是叶子

我已经尝试将它们声明为像这样的选项

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

或者使用typedef,但我仍然无法使用它。

此外,应该可以向任何数组添加新叶

1 个答案:

答案 0 :(得分: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