Decrement index in a loop after Swift C-style loops deprecated

前端 未结 5 1588
谎友^
谎友^ 2020-11-27 20:09

How would you express a decrementing indexed loop in Swift 3.0, where the syntax below is not valid any more?

for var index = 10 ; index > 0; index-=1{
           


        
相关标签:
5条回答
  • 2020-11-27 20:24

    Here is an easier (and more Swifty) approach.

    for i in (0 ..< 5).reversed() {
        print(i) // 4,3,2,1,0
    }
    
    let array = ["a", "b", "c", "d", "e"]
    for element in array.reversed() {
        print(element) // e,d,c,b,a
    }
    
    array.reversed().forEach { print($0) } // e,d,c,b,a
    
    print(Array(array.reversed())) // e,d,c,b,a
    
    0 讨论(0)
  • 2020-11-27 20:28

    You can use stride method:

    10.stride(through: 0, by: -1).forEach { print($0) }
    

    or classic while loop.

    0 讨论(0)
  • 2020-11-27 20:29

    If you still want to use this C-style loop, here is what you need:

    let x = 10
    
    infix operator ..> { associativity left }
    func ..>(left: Int, right: Int) -> StrideTo<Int> {
        return stride(from: left, to: right, by: -1)
    }
    
    for i in x..>0 {
        print(i)
    }
    
    0 讨论(0)
  • 2020-11-27 20:31

    C-style loops with a fixed increment or decrement can be replaced by stride():

    for index in 10.stride(to: 0, by: -1) {
        print(index)
    }
    
    // 10 9 8 7 6 5 4 3 2 1
    

    Use stride(to: ...) or stride(through: ...) depending on whether the last element should be included or not.

    This is for Swift 2. The syntax changed (again) for Swift 3, see this answer.

    0 讨论(0)
  • 2020-11-27 20:46

    From swift 3.0, The stride(to:by:) method on Strideable has been replaced with a free function, stride(from:to:by:)

    for index in stride(from: 10, to: 0, by: -1) {
        print(index)
    }
    
    // You can also use stride condition like
    // {Some Value}.stride(to: 0, by: -1)
    // for index in 10.stride(to: 0, by: -1) { }
    
    0 讨论(0)
提交回复
热议问题