问题描述
在循环之前直接解包可选集合的 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
-Keyword 告诉编译器我只想在 elements
中有这样的值时进行迭代
for element in elements where elements != nil { ... }
不起作用。我基本上是在寻找一种方法来解包集合,在遍历循环之前我不必编写冗长的 guard let
或 if let
。
我不希望使用返回未包装的 Sequence
的属性来扩展 self
,我只是认为它不是很优雅(包括强制展开)。
解决方法
您有几个选择。您可以在 elements
循环中提供一个空数组作为 for ... in
的默认值:
let elements: [Element]?
for element in elements ?? [] {
}
或者您可以在 forEach
上使用 elements
和可选链
elements?.forEach { element in
}
请记住,可选集合是 Swift 中的一种反模式。您可以使用空集合表示缺少值,因此将集合包装在可选项中不会提供任何额外的值,同时会使接口复杂化。
,您的元素不是可选的,但数组是可选的。在您的情况下,只需解开数组:
let elements: [Element]?
for element in elements ?? [] {
// do stuff
}
但是如果你的元素是可选的,你可以使用compactMap:
let elements: [Element?] // elements are optional instead of array
for element in elements.compactMap { $0 } {
// do stuff
}