如何遍历可选集合

How to loop through an optional collection

在循环之前直接解包可选集合的 Swifty 方法是什么? 考虑以下因素:

let elements: [Element]?
for element in elements { ... }

其中 elements 可能包含值。编译器产生错误:For-in loop requires '[Element]?' to conform to 'Sequence'; did you mean to unwrap optional?,与 forEach.

类似

使用 where-关键字告诉编译器,如果 elements 中有值,我只想迭代

for element in elements where elements != nil { ... }

不起作用。我基本上是在寻找一种方法来解开集合,这样我就不必在遍历循环之前编写冗长的 guard letif let

我不想用 returns 展开 self 的 属性 来扩展 Sequence,我只是觉得它不是很优雅(包括强制展开).

您的元素不是可选的,但数组是。在你的情况下,只需打开数组:

let elements: [Element]?
for element in elements ?? [] {
    // do stuff
}

但是如果你的元素是可选的,你可以使用 compactMap:

let elements: [Element?] // elements are optional instead of array
for element in elements.compactMap { [=11=] } {
    // do stuff
}

你有几个选择。您可以在 for ... in 循环中提供一个空数组作为 elements 的默认值:

let elements: [Element]?

for element in elements ?? [] {

}

或者您可以在 elements

上使用 forEach 和可选链接
elements?.forEach { element in

}

请记住,可选集合是 Swift 中的反模式。您可以使用空集合来表示缺少值,因此将集合包装在可选值中不会提供任何额外的值,同时会使界面复杂化。