在关闭时解构元组的元组

时间:2016-05-21 02:04:14

标签: swift closures tuples

我可以轻松地构建一个元组元组:

let tt = (2, (3, 4))

let (a, (b, c)) = tt
b // => 3

我想在声明一个闭包时也这样做,例如我以为我可以写:

[tt].map { (a, (b, c)) in
    // Use b
}

XCode抱怨"未命名的参数必须用空名称编写"。

只有这样我才能做到"工作"是:

[tt].map { (a, tuple: (b: Int, c: Int)) in
    // Use tuple.b
}

这有两个我想避免的缺点:

  • 我需要使用tuple.b代替b
  • 我需要指定bc
  • 的类型

顺便说一句,我的用例是我想用reduce索引,所以我尝试使用array.enumerate().reduce

3 个答案:

答案 0 :(得分:2)

使用额外的分配行,您可以将数组中的值分配给(a, (b, c))以解构元组:

let tt1 = (2, (3, 4))
let tt2 = (5, (6, 7))

[tt1, tt2].map { tt in
    let (a, (b, c)) = tt
    print(b)
}

输出:

3
6

可替换地:

[tt1, tt2].map {
    let (a, (b, c)) = $0
    print(b)
}

答案 1 :(得分:1)

这符合您的第一个要求,但仍需要您添加类型annonation:

typealias TupleType = (a: Int, tuple: (b: Int, c: Int))

let tt: TupleType = (2, (3, 4))

[tt].map {
    print($0.tuple.b)
}

答案 2 :(得分:0)

另一种解决方法:

[tt].map { a, b in
    let (b, c) = b
    print(a, b, c)
}