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
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]