首页 > 解决方案 > 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 }

标签: swift

解决方案


你实际上需要flatMap,不是compactMap

尽管以前(在 Swift 4.1 之前)compactMap也被称为flatMap,但它具有与 current 不同的实现和函数签名flatMap,因为compactMap可以使用而不是连续使用,map并且在仅保留元素的同时将每个元素filter调用到新元素。另一方面,在映射元素时展平嵌套列表。mapnon-nilflatMap

是仍然存在flatMapSequence,而是已弃用flatMapSequence已重命名为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 }

推荐阅读