我尝试使用以下格式在Swift中创建嵌套数组:
(+ 5 (- 1 (+ 34 1)))
所以嵌套数组看起来像:
[+, 5, [-, 1, [+, 34, 1]]]
,arr [0]始终是操作(+, - ,*或/)
我非常擅长快速而且不知道从哪里开始,所以我非常感谢他们的帮助。
答案 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
,将参数left
和right
限制为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表达式。反思这一点,您是否考虑过数组是否适合强度的可能性,并且您可能更容易将列表作为基础表示?列表数据类型实现起来很简单。