arrays - 除非明确引用一个字典枚举键,否则编译器会抱怨
问题描述
我有以下枚举:
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
to隐式键入。TaskKey:Any
我想知道我的假设是否正确。同样为了化妆品的缘故,我的字典中的嵌套条目也可以使用该.title
语法。
解决方案
嵌套的孩子是完全独立的。外部字典[TaskKey:Any]
因此内部数组可以是任何类型。编译器需要一些关于 a.title
是什么的信息。一旦你用 明确了其中一个键TaskKey.title
,Swift 就会推断出其余的键。
另一种方法是使用显式转换(as [[TaskKey:Any]]
或等效as Array<[TaskKey:Any]>
)来告诉 Swift 内部类型:
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 ]
]
注意:通过显式指定类型来简化 Swift 编译器将缩短编译时间。
考虑使用struct
or class
:
我不确定字典是这里数据结构的最佳选择。您可能需要考虑使用struct
or 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
为所需类型更容易访问。
使用 a class
here(优于 a struct
)的优点是它使您能够轻松地更新内部任务:
例如:
// Mark all of the children tasks of the second task as completed
for task in taskDescriptions[1].children {
task.completed = true
}
推荐阅读
- css - docker-compose:站点正在运行但 css 未应用
- loops - 为什么在while循环之后我只得到最后一行的值?
- reactjs - 使用 i18next 调用父级中的子函数
- azure - 在 Azure 中导出操作组模板
- azure - Azure Batch - 升级到最新的 API 版本
- javascript - Google 应用程序脚本 - 迭代期间的变量重置
- r - 如何在 R 中创建基于两级条件运行的代码?
- c# - C# - 用或/和连接括号内的所有内容
- android - Java 7 中的 ISO 8601 持续时间解析
- python - 查找字符串中出现次数最多的字母,并仅打印该字母,而不是计数