Swift List产品

时间:2015-05-24 10:10:59

标签: swift list-comprehension

给出Swift中的两个列表:

let rows = ["a", "b", "c"]
let cols = ["1", "2", "3"]

是否可以使用列表理解来组合它们以产生以下内容:

squares = ["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"]

显然,可以使用" for循环"和类似的结构,但我特别是基于列表理解的解决方案。我知道Swift可以做一些列表理解(例如,让evens = Array(filter(1 ..< 10){$ 0%2 == 0}))但是无法弄清楚它是否可以做类似于以下是Haskell:

let squares = [ r ++ c | r <- rows, c <- cols]

1 个答案:

答案 0 :(得分:4)

一种可能的解决方案(现已针对 Swift 2 进行了更新):

let rows = ["a", "b", "c"]
let cols = ["1", "2", "3"]

let squares = rows.flatMap {
    row in
    cols.map {
        col in
        row + col
    }
}
print(squares)
// [a1, a2, a3, b1, b2, b3, c1, c2, c3]

内部map()cols数组映射到带有的数组 每个条目前面都有行号。外flatMap()地图 rows数组到一个数组数组(每行一个)并展平结果。

略微更为笼统,人们可以定义两个“产品” 序列作为具有所有组合的元组(对)的数组:

func product<S : SequenceType, T : SequenceType>(lseq : S, _ rseq : T) -> [(S.Generator.Element, T.Generator.Element)] {
    return lseq.flatMap { left in
        rseq.map { right in
            (left, right)
        }
    }
}

然后将其用作

let squares = product(rows, cols).map(+)