展平任意数组

Flatten Array of Any

如何展平 Swift 4 中 Any 的数组。 示例: 假设我有一个数组:var array:[Any] = [1, 2, [4, 3], [9, [8, 0]]],在展平这个数组后,我的预期结果是 [1, 2, 4, 3, 9, 8, 0]。我尝试使用 flatMap 但它没有用。

尝试使用Array的reduce和join函数

var array:[Any] = [1, 2, [4, 3], [9, [8, 0]]]

   var flatArray = array.reduce([],+]

else 

   var flatArray = Array(array.joined())

像 Ray Toal 建议的那样(来自 https://rosettacode.org/wiki/Flatten_a_list#Swift

func flatten<T>(_ s: [Any]) -> [T] {
    var r = [T]()
    for e in s {
        switch e {
        case let a as [Any]:
            r += flatten(a)
        case let x as T:
            r.append(x)
        default:
            assert(false, "value of wrong type")
        }
    }
    return r
}

这个函数的作用如下,它遍历数组中的每个元素,如果它在你的情况下找到 Int ,它会将它添加到结果中,如果它找到一个 [Any] 的数组,它会调用自己(递归呼叫)和过程重复,直到每个案例都到达最内层的 Int。最后返回结果。请注意,如果您的数组不是 IntInt 数组 ([Int])

,则会抛出 asset

那么你可以这样做:

var array:[Any] = [1, 2, [4, 3], [9, [8, 0]]]
array = flatten(array)
//result [1, 2, 4, 3, 9, 8, 0]