List comprehension in Swift

前端 未结 8 2237
伪装坚强ぢ
伪装坚强ぢ 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:27

    Here's an extension to the Array types that combines filter and map into one method:

    extension Array {
    
        func filterMap(_ closure: (Element) -> Element?) -> [Element] {
    
            var newArray: [Element] = []
            for item in self {
                if let result = closure(item) {
                    newArray.append(result)
                }
            }
            return newArray
        }
    
    }
    

    It's similar to map except you can return nil to indicate that you don't want the element to be added to the new array. For example:

    let items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    let newItems = items.filterMap { item in
        if item < 5 {
            return item * 2
        }
        return nil
    }
    

    This could also be written more concisely as follows:

    let newItems = items.filterMap { $0 < 5 ? $0 * 2 : nil }
    

    In both of these examples, if the element is less than 5, then it is multiplied by two and added to the new array. If the closure returns nil, then the element is not added. Therefore, newIems is [2, 4, 6, 8].

    Here's the Python equivalent:

    items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    newItems = [n * 2 for n in items if n < 5]
    

提交回复
热议问题