首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中展平数组的数组

在Swift中展平数组的数组
EN

Stack Overflow用户
提问于 2014-06-28 17:03:00
回答 9查看 84.2K关注 0票数 185

Swift在Scala、Xtend、Groovy、Ruby和co中有没有对应的flatten

代码语言:javascript
运行
复制
var aofa = [[1,2,3],[4],[5,6,7,8,9]]
aofa.flatten() // shall deliver [1,2,3,4,5,6,7,8,9] 

当然,我可以使用reduce来实现这一点,但这有点糟糕

代码语言:javascript
运行
复制
var flattened = aofa.reduce(Int[]()){
    a,i in var b : Int[] = a
    b.extend(i)
    return b
}
EN

回答 9

Stack Overflow用户

发布于 2015-10-01 21:11:20

在Swift标准库中,为符合Sequence协议的所有类型(或Swift 3之前的SequenceType上的flatten )实现了joined函数,其中包括Array

代码语言:javascript
运行
复制
let numbers = [[1,2,3],[4],[5,6,7,8,9]]
let flattened = Array(numbers.joined())

在某些情况下,使用joined()可能是有益的,因为它返回一个惰性集合,而不是一个新的数组,但在传递给Array()初始化程序时,总是可以转换为一个数组,就像上面的例子一样。

票数 33
EN

Stack Overflow用户

发布于 2019-01-22 20:07:00

Swift 4.2

我在下面写了一个简单的数组扩展。可以使用展平包含另一个数组或元素的数组。与joined()方法不同。

代码语言:javascript
运行
复制
public extension Array {
    public func flatten() -> [Element] {
        return Array.flatten(0, self)
    }

    public static func flatten<Element>(_ index: Int, _ toFlat: [Element]) -> [Element] {
        guard index < toFlat.count else { return [] }

        var flatten: [Element] = []

        if let itemArr = toFlat[index] as? [Element] {
            flatten = flatten + itemArr.flatten()
        } else {
            flatten.append(toFlat[index])
        }

        return flatten + Array.flatten(index + 1, toFlat)
    }
}

用法:

代码语言:javascript
运行
复制
let numbers: [Any] = [1, [2, "3"], 4, ["5", 6, 7], "8", [9, 10]]

numbers.flatten()
票数 4
EN

Stack Overflow用户

发布于 2020-01-02 16:53:58

Apple Swift版本5.1.2 (swiftlang-1100.0.278 clang-1100.0.33.9)

目标: x86_64-apple-darwin19.2.0

代码语言:javascript
运行
复制
let optionalNumbers = [[1, 2, 3, nil], nil, [4], [5, 6, 7, 8, 9]]
print(optionalNumbers.compactMap { $0 }) // [[Optional(1), Optional(2), Optional(3), nil], [Optional(4)], [Optional(5), Optional(6), Optional(7), Optional(8), Optional(9)]]
print(optionalNumbers.compactMap { $0 }.reduce([], +).map { $0 as? Int ?? nil }.compactMap{ $0 }) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(optionalNumbers.compactMap { $0 }.flatMap { $0 }.map { $0 as? Int ?? nil }.compactMap{ $0 }) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(Array(optionalNumbers.compactMap { $0 }.joined()).map { $0 as? Int ?? nil }.compactMap{ $0 }) // [1, 2, 3, 4, 5, 6, 7, 8, 9]

let nonOptionalNumbers = [[1, 2, 3], [4], [5, 6, 7, 8, 9]]
print(nonOptionalNumbers.compactMap { $0 }) // [[1, 2, 3], [4], [5, 6, 7, 8, 9]]
print(nonOptionalNumbers.reduce([], +)) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nonOptionalNumbers.flatMap { $0 }) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(Array(nonOptionalNumbers.joined())) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24465281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档