gpt4 book ai didi

swift - Swift 中 flatMap 和 compactMap 的区别

转载 作者:IT王子 更新时间:2023-10-29 05:14:03 31 4
gpt4 key购买 nike

似乎在 Swift 4.1 flatMap 中被弃用了。但是 Swift 4.1 compactMap 中有一个新方法在做同样的事情吗?使用 flatMap,您可以转换集合中的每个对象,然后删除所有为 nil 的项目。
喜欢flatMap

let array = ["1", "2", nil] 
array.flatMap { $0 } // will return "1", "2"

喜欢compactMap

let array = ["1", "2", nil] 
array.compactMap { $0 } // will return "1", "2"

compactMap 也在做同样的事情。

这两种方法有什么区别?为什么 Apple 决定重命名该方法?

最佳答案

Swift 标准库为 flatMap 函数定义了 3 个重载:

Sequence.flatMap<S>(_: (Element) -> S) -> [S.Element]  
Optional.flatMap<U>(_: (Wrapped) -> U?) -> U?
Sequence.flatMap<U>(_: (Element) -> U?) -> [U]

最后一个重载函数可以通过两种方式被滥用:
考虑以下结构和数组:

struct Person {
var age: Int
var name: String
}

let people = [
Person(age: 21, name: "Osame"),
Person(age: 17, name: "Masoud"),
Person(age: 20, name: "Mehdi")
]

第一种方式:附加包装和展开:
如果您需要获取包含在 people 数组中的一组人的年龄,您可以使用两个函数:

let flatMappedAges = people.flatMap({$0.age})  // prints: [21, 17, 20]
let mappedAges = people.map({$0.age}) // prints: [21, 17, 20]

在这种情况下,map 函数将完成这项工作,无需使用 flatMap,因为两者产生相同的结果。此外,在 flatMap 的这个用例中有一个无用的包装和解包过程。(闭包参数用一个 Optional 包装它的返回值,而 flatMap 的实现在返回它之前解包 Optional 值)

第二种方式 - 字符串符合收集协议(protocol):
认为您需要从 people 数组中获取人员姓名列表。您可以使用以下行:

let names = people.flatMap({$0.name})  

如果你使用的是 4.0 之前的 swift 版本,你会得到一个转换后的列表

["Osame", "Masoud", "Mehdi"]  

但是在较新的版本中 String 符合 Collection 协议(protocol),因此,您对 flatMap() 的使用将匹配第一个重载函数而不是第三个会给你一个扁平的转换值结果:

["O", "s", "a", "m", "e", "M", "a", "s", "o", "u", "d", "M", "e", "h", "d", "i"]

那么,他们是如何解决的呢?他们弃用了 flatMap() 的第三次重载
由于这些误用,swift 团队决定弃用 flatMap 函数的第三个重载。到目前为止,他们针对需要处理 Optional 的情况的解决方案是引入一个名为 compactMap() 的新函数,它将为您提供预期的结果。

关于swift - Swift 中 flatMap 和 compactMap 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49291057/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com