Iterate over two arrays simultaneously

前端 未结 7 1922
感动是毒
感动是毒 2020-12-02 16:42

I am new to Swift. I have been doing Java programming. I have a scenario to code for in Swift.

The following code is in Java. I need to code in Swift for the followi

相关标签:
7条回答
  • 2020-12-02 16:50

    You can use zip(), which creates a sequence of pairs from the two given sequences:

    let strArr1 = ["Some1", "Some2"]
    let strArr2 = ["Somethingelse1", "Somethingelse2"]
    
    for (e1, e2) in zip(strArr1, strArr2) {
        print("\(e1) - \(e2)")
    }
    

    The sequence enumerates only the "common elements" of the given sequences/arrays. If they have different length then the additional elements of the longer array/sequence are simply ignored.

    0 讨论(0)
  • 2020-12-02 16:54

    With Swift 5, you can use one of the 4 following Playground codes in order to solve your problem.


    #1. Using zip(_:_:) function

    In the simplest case, you can use zip(_:_:) to create a new sequence of pairs (tuple) of the elements of your initial arrays.

    let strArr1 = ["Some1", "Some2", "Some3"]
    let strArr2 = ["Somethingelse1", "Somethingelse2"]
    
    let sequence = zip(strArr1, strArr2)
    
    for (el1, el2) in sequence {
        print("\(el1) - \(el2)")
    }
    
    /*
     prints:
     Some1 - Somethingelse1
     Some2 - Somethingelse2
     */
    

    #2. Using Array's makeIterator() method and a while loop

    It is also easy to loop over two arrays simultaneously with a simple while loop and iterators:

    let strArr1 = ["Some1", "Some2", "Some3"]
    let strArr2 = ["Somethingelse1", "Somethingelse2"]
    
    var iter1 = strArr1.makeIterator()
    var iter2 = strArr2.makeIterator()
    
    while let el1 = iter1.next(), let el2 = iter2.next() {
        print("\(el1) - \(el2)")
    }
    
    /*
     prints:
     Some1 - Somethingelse1
     Some2 - Somethingelse2
     */
    

    #3. Using a custom type that conforms to IteratorProtocol

    In some circumstances, you may want to create you own type that pairs the elements of your initials arrays. This is possible by making your type conform to IteratorProtocol. Note that by making your type also conform to Sequence protocol, you can use instances of it directly in a for loop:

    struct TupleIterator: Sequence, IteratorProtocol {
    
        private var firstIterator: IndexingIterator<[String]>
        private var secondIterator: IndexingIterator<[String]>
    
        init(firstArray: [String], secondArray: [String]) {
            self.firstIterator = firstArray.makeIterator()
            self.secondIterator = secondArray.makeIterator()
        }
    
        mutating func next() -> (String, String)? {
            guard let el1 = firstIterator.next(), let el2 = secondIterator.next() else { return nil }
            return (el1, el2)
        }
    
    }
    
    let strArr1 = ["Some1", "Some2", "Some3"]
    let strArr2 = ["Somethingelse1", "Somethingelse2"]
    
    let tupleSequence = TupleIterator(firstArray: strArr1, secondArray: strArr2)
    
    for (el1, el2) in tupleSequence {
        print("\(el1) - \(el2)")
    }
    
    /*
     prints:
     Some1 - Somethingelse1
     Some2 - Somethingelse2
     */
    

    #4. Using AnyIterator

    As an alternative to the previous example, you can use AnyIterator. The following code shows a possible implementation of it inside an Array extension method:

    extension Array {
    
        func pairWithElements(of array: Array) -> AnyIterator<(Element, Element)> {
            var iter1 = self.makeIterator()
            var iter2 = array.makeIterator()
    
            return AnyIterator({
                guard let el1 = iter1.next(), let el2 = iter2.next() else { return nil }
                return (el1, el2)
            })
        }
    
    }
    
    let strArr1 = ["Some1", "Some2", "Some3"]
    let strArr2 = ["Somethingelse1", "Somethingelse2"]
    
    let iterator = strArr1.pairWithElements(of: strArr2)
    
    for (el1, el2) in iterator {
        print("\(el1) - \(el2)")
    }
    
    /*
     prints:
     Some1 - Somethingelse1
     Some2 - Somethingelse2
     */
    
    0 讨论(0)
  • 2020-12-02 16:58

    You could use Range if you still want to use for in.

    var strArr1: [String] = ["Some1","Some2"]
    var strArr2: [String] = ["Somethingelse1","Somethingelse2"]
    
    for i in Range(start: 0, end: strArr1.count) {
        println(strArr1[i] + " - " + strArr2[i])
    }
    
    0 讨论(0)
  • 2020-12-02 17:10
    for(var i = 0; i < strArr1.count ; i++)
    {
        println(strArr1[i] + strArr2[i])
    }
    

    That should do it. Never used swift before so make sure to test.

    Updated to recent Swift syntax

    for i in 0..< strArr1.count {
        print(strArr1[i] + strArr2[i])
    }
    
    0 讨论(0)
  • 2020-12-02 17:14

    Try This:

    zip([0,2,4,6], [1,3,5,7]).forEach {
        print($0,$1)
    }
    
    zip([0,2,4,6], [1,3,5,7]).forEach {
        print($0.0,$0.1)
    }
    
    0 讨论(0)
  • 2020-12-02 17:14

    You could also enumerate over one array and used the index to look inside the second array:

    Swift 1.2:

    for (index, element) in enumerate(strArr1) {
        println(element)
        println(strArr2[index])
    }
    

    Swift 2:

    for (index, element) in strArr1.enumerate() {
        print(element)
        print(strArr2[index])
    }
    

    Swift 3:

    for (index, element) in strArr1.enumerated() {
        print(element)
        print(strArr2[index])
    }
    
    0 讨论(0)
提交回复
热议问题