swift - compactMap 结果是奇怪的类型
问题描述
我希望allMembers
是 type [Member]
。但它的类型是[[Member]]
. 为什么compactMap
不返回[Member]
类型的结果?
class Team {
let members = Array(repeating: Member(), count: 2)
}
class Member {
}
let teams = Array(repeating: Team(), count: 3)
let allMembers = teams.compactMap { $0.members }
解决方案
你实际上需要flatMap
,不是compactMap
。
尽管以前(在 Swift 4.1 之前)compactMap
也被称为flatMap
,但它具有与 current 不同的实现和函数签名flatMap
,因为compactMap
可以使用而不是连续使用,map
并且在仅保留元素的同时将每个元素filter
调用到新元素。另一方面,在映射元素时展平嵌套列表。map
non-nil
flatMap
这是仍然存在flatMap
的Sequence
,而这是已弃用flatMap
的Sequence
已重命名为compactMap
. 如您所见,重命名版本的函数签名是
func flatMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
, 所以它的闭包输入参数返回一个Optional
值(就像compactMap
现在一样),而仍然存在的flatMap
有一个函数签名
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
,它不会Optional
在其闭包中返回一个。
您应该使用未弃用flatMap
的来展平嵌套的Array<Array<Member>>
.
let allMembers = teams.flatMap { $0.members }
推荐阅读
- docker - 用 docker 部署静态网站有意义吗?
- c++ - 使用成员的地址来初始化基类是否合法?
- vuejs2 - 屏幕中央的定位按钮
- r - 合并依赖于 Column 的行(删除 NA 值)
- javascript - 如何在javascript中制作递归嵌套数组?
- python - 从表中提取所有页面
- python - 是否可以在 python3 中完全使用 Monkey Patch 内置`str`
- powershell - PowerShell 中的 Switch 语句和复制粘贴采用最后一个数组输出,而不是第一个示例
- java - DatePickerCellEditor() 有什么问题?
- java - Random.nextInt 从一本书看来是错误的