在swift中创建嵌套数组

时间:2016-06-06 00:40:22

标签: arrays swift multidimensional-array

我尝试使用以下格式在Swift中创建嵌套数组:

(+ 5 (- 1 (+ 34 1)))

所以嵌套数组看起来像:

[+, 5, [-, 1, [+, 34, 1]]]

,arr [0]始终是操作(+, - ,*或/)

我非常擅长快速而且不知道从哪里开始,所以我非常感谢他们的帮助。

5 个答案:

答案 0 :(得分:4)

您可以使用枚举及其关联值将整数,字符串甚至函数放在同一个数组中。该示例不适用于数组,而仅仅是数字和计算的递归嵌套。

enum Input {
  case Operator((Int, Int) -> Int)
  case Number(Int)
}

编辑:根据Rob的建议。

enum Input {
  case Operator((Int, Int) -> Int)
  case Number(Int)
  indirect case Computation(operator: Input, left: Input, right: Input)
}

这显示了如何声明递归枚举。我希望有一种方法可以将运算符参数限制为Input.Operator,将参数leftright限制为Input类型而不是.Operator

答案 1 :(得分:1)

你可以使用类型为AnyObject的数组,如下例所示。

let arr: [AnyObject]  = ["+", 5, ["-", 1, ["/", 34, 1]]]

因此,为了得到操作数,你可以得到索引0.假设你想要操作数除法" /"如上面的示例,您可以访问此索引

arr[2][2][0]

答案 2 :(得分:1)

正如Price Ringo建议的那样,递归enum绝对是正确的工具。我会按照以下几点来构建它:

enum Operator {
    case Add
    case Subtract
}

enum Expression {
    indirect case Operation(Operator, Expression, Expression)
    case Value(Int)
}

let expression = Expression.Operation(.Add, 
                                      .Value(5),
                                      .Operation(.Subtract,
                                                 .Value(1),
                                                 .Operation(.Add, .Value(34), .Value(1))))

如果你愿意的话,你可以用价格来实现功能,这可能非常聪明,但我怀疑实际上解析起来会更令人头痛。但如果你愿意,它看起来像这样:

enum Expression {
    indirect case Operation((Int, Int) -> Int, Expression, Expression)
    case Value(Int)
}

let expression = Expression.Operation(+, 
                                      .Value(5), 
                                      .Operation(-, 
                                                 .Value(1), 
                                                 .Operation(+, .Value(34), .Value(1))))

或者,您可以创建Operator类型而不是传入函数。这就是我可能会建议去的,除非你真的想要拖曳

答案 3 :(得分:0)

我认为你不能用不同的类型构建数组。我的意思是你想用Integers构建一个数组,运算符应该是字符串...但是你不能同时拥有数组。

点击此链接,它可能会有所帮助http://totallyswift.com/nested-collections/

答案 4 :(得分:0)

您的示例看起来像经典的Lisp表达式。反思这一点,您是否考虑过数组是否适合强度的可能性,并且您可能更容易将列表作为基础表示?列表数据类型实现起来很简单。