Creating an extension to filter nils from an Array in Swift

前端 未结 7 678
难免孤独
难免孤独 2020-11-29 04:12

I\'m trying to write an extension to Array which will allow an array of optional T\'s to be transformed into an array of non-optional T\'s.

e.g. this could be writte

7条回答
  •  天命终不由人
    2020-11-29 04:37

    It's not possible to restrict the type defined for a generic struct or class - the array is designed to work with any type, so you cannot add a method that works for a subset of types. Type constraints can only be specified when declaring the generic type

    The only way to achieve what you need is by creating either a global function or a static method - in the latter case:

    extension Array {
        static func filterNils(_ array: [Element?]) -> [Element] {
            return array.filter { $0 != nil }.map { $0! }
        }
    }
    
    var array:[Int?] = [1, nil, 2, 3, nil]
    
    Array.filterNils(array)
    

    Or simply use compactMap (previously flatMap), which can be used to remove all nil values:

    [1, 2, nil, 4].compactMap { $0 } // Returns [1, 2, 4]
    

提交回复
热议问题