微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何遍历可选集合

如何解决如何遍历可选集合

在循环之前直接解包可选集合的 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 letif 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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?