在一个实践问题中,我被要求在字符串数组中打印出所有非零的元素,然后我意识到
for case let name? in names{
print(name)
}
会做这份工作。但这不是违反直觉的吗?
在代码段中,我将其读为“对于名称中的每个元素(具有实际值或nil)”,但实际上应该是“针对名称中的每个元素(实际值)”。
有人可以帮助我理解摘录吗?
答案 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?
根本不是可选的。
将?
视为删除name
的可选项的运算符。如果该赋值将导致nil
,则该循环不会发生,而是开始下一次迭代。
请注意,如果没有case
,您根本不会得到相同的行为。
此:
for name in names {
print(name)
}
将获得以下输出:
Optional("b")
nil
Optional("x")
这些都不起作用。
答案 1 :(得分:0)
您可以将过滤器与条件过滤器一起使用,然后按如下所示打印结果:
let nameNotNil = names.filter{$0 != nil} //filter all values diferent nil
print(nameNotNil) // can be nil if any didnt has strings