如何快速理解for循环中的optionals的模式匹配

时间:2018-10-08 20:59:27

标签: swift pattern-matching optional

在一个实践问题中,我被要求在字符串数组中打印出所有非零的元素,然后我意识到

for case let name? in names{
    print(name)
}

会做这份工作。但这不是违反直觉的吗?

在代码段中,我将其读为“对于名称中的每个元素(具有实际值或nil)”,但实际上应该是“针对名称中的每个元素(实际值)”。

有人可以帮助我理解摘录吗?

2 个答案:

答案 0 :(得分:1)

您想知道为什么使用此代码:

let names = ["b", nil, "x"]
for case let name? in names {
    print(name)
}

产生此输出:

b
x

您想知道nil会怎样。

答案是"Optional Pattern" found in the Language Reference

  

可选模式提供了一种便捷的方式来迭代   for-in语句中的可选值数组,执行以下语句的主体   循环仅适用于非null元素。

case关键字至关重要。它极大地改变了for循环的性质。从该编译器错误中可以看出,循环中的name?根本不是可选的。

compiler error using guard on non-optional

?视为删除name的可选项的运算符。如果该赋值将导致nil,则该循环不会发生,而是开始下一次迭代。

请注意,如果没有case,您根本不会得到相同的行为。

此:

for name in names {
    print(name)
}

将获得以下输出:

Optional("b")
nil
Optional("x")

这些都不起作用。

enter image description here

enter image description here

答案 1 :(得分:0)

您可以将过滤器与条件过滤器一起使用,然后按如下所示打印结果:

let nameNotNil = names.filter{$0 != nil} //filter all values diferent nil
print(nameNotNil) // can be nil if any didnt has strings