【问题标题】:Creating nested arrays in swift快速创建嵌套数组
【发布时间】:2016-06-06 00:40:21
【问题描述】:

我正在尝试在 Swift 中创建以以下格式输入的数据的嵌套数组:

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

所以嵌套数组看起来像:

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

arr[0] 始终是运算(+、-、* 或 /)

我对 swift 很陌生,真的不知道从哪里开始,所以我非常感谢您的帮助。

【问题讨论】:

    标签: arrays swift multidimensional-array


    【解决方案1】:

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

    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

    【讨论】:

    • 这绝对是 IMO 的正确方向,但 Input 在这里不是递归的(我认为它需要递归)。
    【解决方案2】:

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

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

    因此,为了获得操作数,您可以在索引 0 处获得。假设您想要操作数除法“/”作为上面的示例,您可以在该索引处进行

    arr[2][2][0]
    

    【讨论】:

      【解决方案3】:

      正如 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 类型而不是传入函数。这就是我可能会推荐的方式,除非你真的想要能够拖曳

      【讨论】:

        【解决方案4】:

        我认为你不能构建具有不同类型的数组。我的意思是你想构建一个带有整数的数组,并且运算符应该是字符串……但你不能同时在一个数组中。

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

        【讨论】:

        • 有没有办法制作整数字符串?然后全部变成字符串?
        • 是的,只需将它们放在引号之间,例如 ["+", "5", ["-", "1", ["+", "34", "1"] ]]
        • 现在,当您检索这些值时,它们将是字符串......所以除非您再次将它们转换为整数,否则您将无法加/乘/减或除它们
        【解决方案5】:

        您的示例看起来像一个经典的 Lisp 表达式。反映这一点,您是否考虑过数组是强制拟合的可能性,并且您可能会更轻松地使用列表作为基础表示?列表数据类型很容易实现。

        【讨论】:

          猜你喜欢
          • 2018-05-23
          • 2018-02-04
          • 2021-09-18
          • 1970-01-01
          • 2014-11-14
          • 2021-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多