【问题标题】:In Swift, is there a way to to assign elements of array to multiple variables?在 Swift 中,有没有办法将数组的元素分配给多个变量?
【发布时间】:2020-11-30 01:07:56
【问题描述】:

我有一个像这样的长数组:

let array = [1, 2, 3]

我想将所有元素的值分配给不同的变量,如下所示:

var a, b, c:Int
[a, b, c] = array

我知道可以使用元组,但我需要使用数组而不是单独执行每个变量。

【问题讨论】:

  • 问题是你为什么需要这个?只需使用集合索引而不是变量
  • 如果我有 10 个变量并且我需要创建一个函数来根据数组更改它们的变量,我如何在不单独分配每个变量的情况下做到这一点
  • 只使用数组本身。如果需要,您可以使用inout 关键字。
  • 您需要的结构具有您需要的所有属性。很简单。
  • 永远不会太晚。最好现在修复它,否则它会升级

标签: arrays swift variable-assignment


【解决方案1】:

在可用的list of patterns 中,没有“数组模式”或类似的东西,因此您无法对数组进行模式匹配。但是,您可以做的是:

let array = [1,2,3]
let (a, b, c) = (array[0], array[1], array[2])

如果数组的元素少于 3 个,这将在运行时引发错误。

【讨论】:

    【解决方案2】:

    它很有用,但不是内置的。并且非可变泛型让它变得很痛苦。

    let (a, b, c) = [1, 2, 3].tuple3!
    
    /// A workaround for not being able to extend tuples.
    public struct Tuple<Elements> {
      public var elements: Elements
    
      public init(_ elements: Elements) {
        self.elements = elements
      }
    }
    
    public extension Tuple {
      // MARK: - 2-tuple
    
      /// Create a new tuple with one more element.
      static subscript<Element0, Element1, Element2>(
        tuple: Elements, element: Element2
      ) -> (Element0, Element1, Element2)
      where Elements == (Element0, Element1) {
        (tuple.0, tuple.1, element)
      }
    
      // MARK: - 3-tuple
    
      /// Create a new tuple with one more element.
      static subscript<Element0, Element1, Element2, Element3>(
        tuple: Elements, element: Element3
      ) -> (Element0, Element1, Element2, Element3)
      where Elements == (Element0, Element1, Element2) {
        (tuple.0, tuple.1, tuple.2, element)
      }
    }
    
    public extension Sequence {
      typealias Tuple2 = (Element, Element)
      typealias Tuple3 = (Element, Element, Element)
      typealias Tuple4 = (Element, Element, Element, Element)
    
      var tuple2: Tuple2? { makeTuple2()?.tuple }
      var tuple3: Tuple3? { makeTuple3()?.tuple }
      var tuple4: Tuple4? { makeTuple4()?.tuple }
    
      private func makeTuple2() -> (
        tuple: Tuple2,
        getNext: () -> Element?
      )? {
        var iterator = makeIterator()
        let getNext = { iterator.next() }
    
        guard
          let _0 = getNext(),
          let _1 = getNext()
        else { return nil }
    
        return ((_0, _1), getNext)
      }
    
      private func makeTuple3() -> (
        tuple: Tuple3,
        getNext: () -> Element?
      )? {
        guard
          let (tuple, getNext) = makeTuple2(),
          let element = getNext()
        else { return nil }
    
        return (Tuple[tuple, element], getNext)
      }
    
      private func makeTuple4() -> (
        tuple: Tuple4,
        getNext: () -> Element?
      )? {
        guard
          let (tuple, getNext) = makeTuple3(),
          let element = getNext()
        else { return nil }
    
        return (Tuple[tuple, element], getNext)
      }
    }
    

    【讨论】:

    • 你真的在建议这样的事情吗?
    • 是的。它应该在标准库中。
    猜你喜欢
    • 2021-08-12
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2013-05-07
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多