代码之家  ›  专栏  ›  技术社区  ›  Besi

编译器会抱怨,除非显式引用了一个字典枚举键

  •  0
  • Besi  · 技术社区  · 6 年前

    我有以下枚举:

    enum TaskKey: String{
        case title = "title"
        case completed = "completed"
        case children = "children"
    }
    

    现在我用这些键创建了一个字典:

        let taskDescriptions : Array<[TaskKey:Any]> = [
            [ .title : "Buy milk",
              .completed : false ],
    
            [ .title     : "Sleep",
              .completed : false,
              .children  :
                [
                    // `TaskKey` is required here
                    [ TaskKey.title     : "Find a bed",
                      .completed : false
                    ],
    
                    [ .title     : "Wait",
                      .completed : false
                    ]
                ] ],
    
            [ .title     : "Dance",
              .completed : false ]
            ]
    

    <[TaskKey:Any]> 我可以使用 .title 而不是 TaskKey.title . 然而,对于 .children TaskKey. 否则编译器会抱怨。

    在我看来这有点奇怪。我假设编译器隐式地从 Any TaskKey:Any

    我不知道我的假设是否正确。为了化妆品的缘故,也可以使用 .职务 语法也适用于我字典中的嵌套条目。

    1 回复  |  直到 6 年前
        1
  •  4
  •   vacawama    6 年前

    [TaskKey:Any] 所以内部数组可以是任何类型。编译器需要一些关于 .title 是。一旦你把其中一个键用 TaskKey.title ,斯威夫特推断出其余的。

    as [[TaskKey:Any]] 或同等地 as Array<[TaskKey:Any]>

    let taskDescriptions : Array<[TaskKey:Any]> = [
        [ .title : "Buy milk",
          .completed : false ],
    
        [ .title     : "Sleep",
          .completed : false,
          .children  :
            [
                // `TaskKey` is required here
                [ .title     : "Find a bed",
                  .completed : false
                ],
    
                [ .title     : "Wait",
                  .completed : false
                ]
            ] as [[TaskKey:Any]] ],
    
        [ .title     : "Dance",
          .completed : false ]
    ]
    

    注:


    考虑使用 struct class

    我不确定字典是这里数据结构的最佳选择。你可以考虑使用 结构 :

    class Task: CustomStringConvertible {
        var title: String
        var completed: Bool
        var children: [Task]
        var description: String { return "Task(title: \(title), completed: \(completed), children: \(children)" }  
    
        init(title: String, completed: Bool, children: [Task] = []) {
            self.title = title
            self.completed = completed
            self.children = children
        }
    }
    
    var taskDescriptions : [Task] = [
        Task(title: "Buy milk",
             completed: false
        ),
    
        Task(title: "Sleep",
          completed: false,
          children:
            [
                Task(title: "Find a bed",
                  completed: false
                ),
    
                Task(title: "Wait",
                  completed: false
                )
            ]
        ),
    
        Task(title: "Dance",
          completed: false
        )
    ]
    

    这将比处理铸造要容易得多 Any 到所需类型。

    使用 这里(在一个房间里) 结构 )它使您能够轻松地更新内部任务:

    例如:

    // Mark all of the children tasks of the second task as completed
    for task in taskDescriptions[1].children {
        task.completed = true
    }