【问题标题】:Destructuring tuple of tuple in closure在闭包中解构元组的元组
【发布时间】:2019-09-19 01:20:18
【问题描述】:

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

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

【问题讨论】:

标签: swift closures tuples


【解决方案1】:

通过额外的赋值行,您可以将数组中的值分配给(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)
}

【讨论】:

  • 您还可以在风格上更改您的第二个表单,将let 放在大括号的同一行,因此它接近正常的myVar in 表单。
【解决方案2】:

这满足了您的第一个要求,但仍然需要您添加类型注释:

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

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

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

【讨论】:

    【解决方案3】:

    另一种解决方法:

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

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多