Swift Playground 是探索该语言的好地方。即使您无法运行整个代码,您也可以在其周围放置一些支持部件以查看发生了什么。
oldArray 显然包含一些 enum 值。从您的 sn-p 中,我们可以看到其中一个值是 .entry。我创建了一个名为State 的enum 用于探索目的,并给出了几个案例(entry、foo、bar)。
现在将您的 sn-p 放入一个函数中,并给它一个 oldArray 以供使用。在// Do stuff部分添加print,真相就会大白:
enum State {
case entry
case foo
case bar
}
func test() {
let oldArray: [State] = [.entry, .entry, .bar, .entry, .foo]
do {
oldArray.enumerated().forEach { oldTuple in
guard case .entry = oldTuple.element else {
return
}
// Do stuff
print(oldTuple)
}
}
}
test()
输出
(offset: 0, element: __lldb_expr_1.State.entry)
(offset: 1, element: __lldb_expr_1.State.entry)
(offset: 3, element: __lldb_expr_1.State.entry)
这return 是否等同于break?
如果不满足guard 条件,它会从闭包中返回。
guard 条件是什么?一些任务...?
.enumerated 将oldArray 变成(offset: Int, element: State) 元组的序列。所以示例数组变为[(offset: 0, element: .entry), (offset: 1, element: .entry), ...]。 forEach 依次获取每个元组并将其分配给 oldTuple。
guard 正在使用模式匹配来验证当前元组的element 值是否为.entry,否则它会退出闭包。
语法有点奇怪,但它的意思是,要继续超出这条语句,当前元组的element 必须是.entry,否则return 从闭包中放弃处理这个元素 em>。
因此,此代码循环遍历枚举数组并仅处理 .entry 的枚举。
do 有什么作用?
我们从你的 sn-p 中看不到任何东西。如果您注释掉do { 和相应的},测试仍然会做同样的事情。 do 通常与错误处理 一起使用以包围可能throw 出错的调用。 do 语句通常与catch 语句一起使用,然后捕获抛出的错误。 do { } 本身只是创建了一个新范围。