【问题标题】:Swift Extended iterable unpacking of tuples元组的 Swift 扩展可迭代解包
【发布时间】:2022-01-09 02:57:34
【问题描述】:

我们知道在 Python 中你可以做到

s = (3,5,2)
a, *b = s # a=3 b=[5,2]

也就是说,你可以解压缩元组的第一个元素和 其余的

我很难在 Swift 中找到相同的东西:

var tuple = ("Boston", "Red Sox", 97, 65, 59.9)
var (first, rest) = tuple

【问题讨论】:

  • 尽管名称相同,但 Python 元组和 Swift 元组几乎没有任何相似之处。 Python 的元组只是不可变的列表,就像使用 let 声明的 Swift 数组一样。 Swift 的元组是强类型的(并且是结构类型的)。如果没有可变参数泛型,就不可能对它们进行任何有用的“first/rest”函数式处理。数组会更适合这项工作。

标签: swift tuples


【解决方案1】:

你可以做一些通用函数来做到这一点:

func firstRest<A, B, C>(_ tup: (A, B, C)) -> (A, (B, C)) {
    (tup.0, (tup.1, tup.2))
}

func firstRest<A, B, C, D>(_ tup: (A, B, C, D)) -> (A, (B, C, D)) {
    (tup.0, (tup.1, tup.2, tup.3))
}

func firstRest<A, B, C, D, E>(_ tup: (A, B, C, D, E)) -> (A, (B, C, D, E)) {
    (tup.0, (tup.1, tup.2, tup.3, tup.4))
}

func firstRest<A, B, C, D, E, F>(_ tup: (A, B, C, D, E, F)) -> (A, (B, C, D, E, F)) {
    (tup.0, (tup.1, tup.2, tup.3, tup.4, tup.5))
}

现在你可以:

let tuple = ("Boston", "Red Sox", 97, 65, 59.9)
let (first, rest) = firstRest(tuple)
print(first)
print(rest)

【讨论】:

    【解决方案2】:

    没有(目前),Swift 是强类型的。即编译器必须知道这些信息——你可以编写一个函数来解包。

    func unpack(tuple: (String, String, Double, Double, Double)) -> (String, (String, Double, Double, Double)) {
      return (tuple.0,(tuple.1, tuple.2, tuple.3, tuple.4))
    }
    

    如果一个元组中有两个/三个以上的元素,建议将它们分组到某个模型下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2011-10-21
      相关资源
      最近更新 更多