如何遍历可选集合
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 let
或 if 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 中的反模式。您可以使用空集合来表示缺少值,因此将集合包装在可选值中不会提供任何额外的值,同时会使界面复杂化。
在循环之前直接解包可选集合的 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 let
或 if 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 中的反模式。您可以使用空集合来表示缺少值,因此将集合包装在可选值中不会提供任何额外的值,同时会使界面复杂化。