List comprehension in Swift

前端 未结 8 2238
伪装坚强ぢ
伪装坚强ぢ 2020-12-07 13:53

The language guide has revealed no trace of list comprehension. What\'s the neatest way of accomplishing this in Swift? I\'m looking for something similar t

8条回答
  •  再見小時候
    2020-12-07 14:48

    With Swift 5, you can choose one of the seven following Playground sample codes in order to solve your problem.


    #1. Using stride(from:to:by:) function

    let sequence = stride(from: 0, to: 10, by: 2)
    let evens = Array(sequence)
    // let evens = sequence.map({ $0 }) // also works
    print(evens) // prints [0, 2, 4, 6, 8]
    

    #2. Using Range filter(_:) method

    let range = 0 ..< 10
    let evens = range.filter({ $0 % 2 == 0 })
    print(evens) // prints [0, 2, 4, 6, 8]
    

    #3. Using Range compactMap(_:) method

    let range = 0 ..< 10
    let evens = range.compactMap({ $0 % 2 == 0 ? $0 : nil })
    print(evens) // prints [0, 2, 4, 6, 8]
    

    #4. Using sequence(first:next:) function

    let unfoldSequence = sequence(first: 0, next: {
        $0 + 2 < 10 ? $0 + 2 : nil
    })
    let evens = Array(unfoldSequence)
    // let evens = unfoldSequence.map({ $0 }) // also works
    print(evens) // prints [0, 2, 4, 6, 8]
    

    #5. Using AnySequence init(_:) initializer

    let anySequence = AnySequence({ () -> AnyIterator in
        var value = 0
        return AnyIterator {
            defer { value += 2 }
            return value < 10 ? value : nil
        }
    })
    let evens = Array(anySequence)
    // let evens = anySequence.map({ $0 }) // also works
    print(evens) // prints [0, 2, 4, 6, 8]
    

    #6. Using for loop with where clause

    var evens = [Int]()
    for value in 0 ..< 10 where value % 2 == 0 {
        evens.append(value)
    }
    print(evens) // prints [0, 2, 4, 6, 8]
    

    #7. Using for loop with if condition

    var evens = [Int]()
    for value in 0 ..< 10 {
        if value % 2 == 0 {
            evens.append(value)
        }
    }
    print(evens) // prints [0, 2, 4, 6, 8]
    

提交回复
热议问题