Swift中map与flatMap输出差异解析:为何flatMap拆分字符串键?
为什么Swift中用flatMap处理字典键会把字符串拆成单个字符?
先看两段代码的差异:
使用flatMap的代码
let scoresByName = ["Henk": [0, 5, 8], "John": [2, 5, 8]] let flatMapResult = scoresByName.flatMap { $0.key } print(flatMapResult) // 输出:["J", "o", "h", "n", "H", "e", "n", "k"]
使用map的代码
let scoresByName = ["Henk": [0, 5, 8], "John": [2, 5, 8]] let mapResult = scoresByName.map { $0.key } // 输出:["John", "Henk"]
核心原因是map和flatMap的设计逻辑完全不同:
map是「一对一转换」:对序列里的每个元素执行转换操作,直接把转换后的元素收集成新序列。这里字典的每个元素是
(key: String, value: [Int]),map { $0.key }就是把每个键直接取出,最终得到[String]类型的数组,也就是完整的字符串键集合。flatMap在这里用的是「扁平化序列」的重载:它要求闭包返回一个序列类型的结果,然后会把所有子序列里的元素拆出来,合并成一个单一的序列。
而Swift中的String本身就是由Character组成的序列,当你在flatMap的闭包里返回$0.key(也就是一个String)时,这个字符串会被自动拆成单个字符的序列。比如"John"会被拆解成["J","o","h","n"],"Henk"拆解成["H","e","n","k"],flatMap最后把这些字符全部合并,就得到了单个字符组成的数组。
如果非要用flatMap得到和map一样的结果(完全没必要,map更适合这个场景),可以把返回值包装成单元素数组,让闭包返回[String]类型:
let flatMapResult = scoresByName.flatMap { [$0.key] } // 输出:["John", "Henk"]
内容的提问来源于stack exchange,提问作者mangesh
相关产品推荐
相关产品推荐

