【发布时间】:2016-06-06 00:40:21
【问题描述】:
我正在尝试在 Swift 中创建以以下格式输入的数据的嵌套数组:
(+ 5 (- 1 (+ 34 1)))
所以嵌套数组看起来像:
[+, 5, [-, 1, [+, 34, 1]]]
arr[0] 始终是运算(+、-、* 或 /)
我对 swift 很陌生,真的不知道从哪里开始,所以我非常感谢您的帮助。
【问题讨论】:
标签: arrays swift multidimensional-array
我正在尝试在 Swift 中创建以以下格式输入的数据的嵌套数组:
(+ 5 (- 1 (+ 34 1)))
所以嵌套数组看起来像:
[+, 5, [-, 1, [+, 34, 1]]]
arr[0] 始终是运算(+、-、* 或 /)
我对 swift 很陌生,真的不知道从哪里开始,所以我非常感谢您的帮助。
【问题讨论】:
标签: arrays swift multidimensional-array
您可以使用枚举及其关联值将整数、字符串甚至函数放在同一个数组中。该示例不适用于数组,而只是数字和计算的递归嵌套。
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。
【讨论】:
Input 在这里不是递归的(我认为它需要递归)。
您可以使用类型为 AnyObject 的数组,如下例所示。
let arr: [AnyObject] = ["+", 5, ["-", 1, ["/", 34, 1]]]
因此,为了获得操作数,您可以在索引 0 处获得。假设您想要操作数除法“/”作为上面的示例,您可以在该索引处进行
arr[2][2][0]
【讨论】:
正如 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))))
如果你愿意,你可以用 Price 的方法来处理函数,这可能很聪明,但我怀疑实际上解析起来会更令人头疼。但如果你愿意,它看起来像这样:
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 类型而不是传入函数。这就是我可能会推荐的方式,除非你真的想要能够拖曳
【讨论】:
我认为你不能构建具有不同类型的数组。我的意思是你想构建一个带有整数的数组,并且运算符应该是字符串……但你不能同时在一个数组中。
检查此链接,它可能会有所帮助http://totallyswift.com/nested-collections/
【讨论】:
您的示例看起来像一个经典的 Lisp 表达式。反映这一点,您是否考虑过数组是强制拟合的可能性,并且您可能会更轻松地使用列表作为基础表示?列表数据类型很容易实现。
【讨论】: