gpt4 book ai didi

ios - 使用函数式编程将嵌套的字符串数组转换为嵌套的 double 组

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:40 25 4
gpt4 key购买 nike

我想将嵌套的字符串数组转换为嵌套的 double 组

例子:

let Strings = [["1.1", "1.2"],["2.1", "2.2"]]

let Doubles = [[1.1, 1.2],[2.1, 2.2]]

我试过了

let Doubles = Strings.flatMap(){$0}.flatMap(){Double($0)}

但在这种情况下,我获得了一个 double 值数组,如何使这个数组保持嵌套?

编辑:

您能否详细说明为什么不使用 map() 两次或 flatMap() 两次?为什么正确的做法是先使用 map,然后再使用 flatMap

最佳答案

让我们尝试解决问题。数组有一个 map()方法

/// Returns an array containing the results of mapping the given closure
/// over the sequence's elements.
public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]

通过转换每个元素创建一个新数组,以及一个 flatMap()方法

/// Returns an array containing the non-`nil` results of calling the given
/// transformation with each element of this sequence.
public func flatMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

类似但忽略映射到 nil 的元素通过关闭。

还有一个flatMap()方法

/// Returns an array containing the concatenated results of calling the
/// given transformation with each element of this sequence.
public func flatMap<SegmentOfResult : Sequence>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]

将每个元素转换为一个序列并连接结果。

您的代码调用第二个 flatMap() 方法来展平数组到一维,然后第一个 flatMap() 方法到将字符串转换为数字。


转换数组(或一般的序列)的第一个候选对象是 map(),并且也适用于嵌套数组:

let strings = [["1.0", "2.0"],["3.0", "4.0"]]
let doubles = strings.map { $0.map { Double($0) }}
print(doubles) // [[Optional(1.0), Optional(2.0)], [Optional(3.0), Optional(4.0)]]

结果是一个嵌套的可选值数组,因为转换到浮点值可能会失败。如何解决?

强制展开(通常不推荐):

let strings = [["1.0", "2.0"],["3.0", "4.0"]]
let doubles = strings.map { $0.map { Double($0)! }}
print(doubles) // [[1.0, 2.0], [3.0, 4.0]]

如果您有固定数据并且可以保证那很好每个字符串都是有效的浮点值。如果没有,程序会崩溃:

let strings = [["1.0", "2.0"],["3.0", "wot?"]]
let doubles = strings.map { $0.map { Double($0)! }}
// fatal error: unexpectedly found nil while unwrapping an Optional value

提供默认值:

let strings = [["1.0", "2.0"],["3.0", "wot?"]]
let doubles = strings.map { $0.map { Double($0) ?? 0.0 }}
print(doubles) // [[1.0, 2.0], [3.0, 0.0]]

这里无效的字符串被映射到0.0,所以“shape”数组的保留。但是 0.0 现在是一个“神奇的数字”,我们无法从结果中看出它是否来自有效的或无效的字符串。

忽略无效字符串。现在 flatMap() 开始发挥作用(第一版):

let strings = [["1.0", "2.0"],["3.0", "wot?"]]
let doubles = strings.map { $0.flatMap { Double($0) }}
print(doubles) // [[1.0, 2.0], [3.0]]

内部的flatMap()返回一个非nil的数组Double($0) 值,即忽略所有无效字符串。

优点:代码不会因无效输入而崩溃,并且没有使用“魔数(Magic Number)”。可能的缺点:数组形状没有保留。

所以选择你的选择吧!

关于ios - 使用函数式编程将嵌套的字符串数组转换为嵌套的 double 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40591427/

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