Variadic Zip Function in Swift

后端 未结 2 861
[愿得一人]
[愿得一人] 2021-01-15 19:47

Variadic Zip Function

Swift 4.1, Xcode 9.4

I have been using Apple\'s native zip(_:_:) recently and I ran into a situation whereby I needed

2条回答
  •  情书的邮戳
    2021-01-15 20:16

    You need all the functions but you don't need multiple ZipSequence types.

    @inlinable public func zip(
      _ sequence0: Sequence0, _ sequence1: Sequence1, _ sequence2: Sequence2
    ) -> AnySequence<(Sequence0.Element, Sequence1.Element, Sequence2.Element)> {
      .init(
        sequence(
          state: (
            sequence0.makeIterator(), sequence1.makeIterator(), sequence2.makeIterator()
          )
        ) {
          .init(
            ($0.0.next(), $0.1.next(), $0.2.next())
          )
        }
      )
    }
    
    @inlinable public func zip<
      Sequence0: Sequence, Sequence1: Sequence, Sequence2: Sequence, Sequence3: Sequence
    >(
      _ sequence0: Sequence0, _ sequence1: Sequence1, _ sequence2: Sequence2, _ sequence3: Sequence3
    ) -> AnySequence<(Sequence0.Element, Sequence1.Element, Sequence2.Element, Sequence3.Element)> {
      .init(
        sequence(
          state: (
            sequence0.makeIterator(), sequence1.makeIterator(), sequence2.makeIterator(), sequence3.makeIterator()
          )
        ) {
          .init(
            ($0.0.next(), $0.1.next(), $0.2.next(), $0.3.next())
          )
        }
      )
    }
    
    public extension Optional {
      /// Exchange three optionals for a single optional tuple.
      /// - Returns: `nil` if any tuple element is `nil`.
      init(_ optionals: (Wrapped0?, Wrapped1?, Wrapped2?))
      where Wrapped == (Wrapped0, Wrapped1, Wrapped2) {
        switch optionals {
        case let (wrapped0?, wrapped1?, wrapped2?):
          self = (wrapped0, wrapped1, wrapped2)
        default:
          self = nil
        }
      }
    
      /// Exchange four optionals for a single optional tuple.
      /// - Returns: `nil` if any tuple element is `nil`.
      init(_ optionals: (Wrapped0?, Wrapped1?, Wrapped2?, Wrapped3?))
      where Wrapped == (Wrapped0, Wrapped1, Wrapped2, Wrapped3) {
        switch optionals {
        case let (wrapped0?, wrapped1?, wrapped2?, wrapped3?):
          self = (wrapped0, wrapped1, wrapped2, wrapped3)
        default:
          self = nil
        }
      }
    }
    

提交回复
热议问题