gpt4 book ai didi

ios - 与可选数组一起使用时,Swift flatMap 给出了意想不到的结果

转载 作者:可可西里 更新时间:2023-11-01 03:08:24 24 4
gpt4 key购买 nike

我们有一个 Person 对象数组,每个对象都有另一个 String 数组,这是可选的。我们想要我们社会中汽车名称的综合列表。

struct Person {
let name: String
let address: String
let age: Int
let income: Double
let cars: [String]?
}
let personsArray = [Person(name:"Santosh", address: "Pune, India", age:34, income: 100000.0, cars:["i20","Swift VXI"]),
Person(name: "John", address:"New York, US", age: 23, income: 150000.0, cars:["Crita", "Swift VXI"]),
Person(name:"Amit", address:"Nagpure, India", age:17, income: 200000.0, cars:nil)]

let flatmapArray = personsArray.flatMap({$0.cars})
print(flatmapArray)

// Expected Result: ["i20", "Swift VXI", "Crita", "Swift VXI"]

// Result: [["i20", "Swift VXI"], ["Crita", "Swift VXI"]]

为什么它没有给我一个字符串数组作为结果?

我对上面的代码做了一些修改,如下所示,我们尝试将空数组传递给第三人对象,而不是“nil”。

Person(name:"Amit", address:"Nagpure, India", age:17, income: 200000.0, cars:Array())

结果是:

[["i20", "Swift VXI"], ["Crita", "Swift VXI"], []]

仍然不是预期的结果。

如果我从 cars 数组中删除可选的,例如,

let cars: [String]  
Person(name:"Amit", address:"Nagpure, India", age:17, income: 200000.0, cars:Array())

然后它按预期工作。

结果:

["i20", "Swift VXI", "Crita", "Swift VXI"]

我不确定如果成员类型为 Collection is optional,为什么不给出上述结果?

最佳答案

问题在于,对于 mapflatMap 而言,可选项是 0 或 1 个元素的集合。您可以直接在可选对象上调用 mapflatMap 而无需展开它们:

let foo: Int? = 5
foo.map { $0 * $0 } // Int? = 25; "collection of one element"
let bar: Int? = nil
bar.map { $0 * $0 } // Int? = nil; "collection of zero elements"

为了以更熟悉的方式说明您当前的情况,您正在查看与此等效的内容:

class Person {
let cars: [[String]]
}

如果你有一个 var persons: [Person] 并调用了 persons.flatMap { $0.cars },这个操作的结果类型无疑是 [[String]]:您从三层集合开始,最后是两层。

这实际上也是 [String]? 而不是 [[String]] 的情况。

在您所描述的情况下,我建议删除可选的并使用空数组。我不确定 nil 数组和 empty 数组之间的区别在你的情况下是否真的有必要:我的解释是 nil 数组意味着这个人没有能力拥有汽车,而空数组表示此人有能力拥有汽车但没有。

如果你不能删除可选的,那么你将需要调用 flatMap 两次来展平两层而不是一层:

persons.flatMap { $0.cars }.flatMap { $0 }

关于ios - 与可选数组一起使用时,Swift flatMap 给出了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48800768/

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