Add convenient compactMap variant to downcast elements to given type.

Introduction

Since we have "Keypaths as functions" proposal implemented, it is one of steps on a road to explicit functions as parameters in compactMap.
Swift-evolution thread: Discussion thread topic for that proposal

Motivation

I catch myself on following pattern: filter elements of special type and downcast them to this type.

sequence.compactMap({ $0 as? Type })

This pitch allows us to write:

sequence.compactMap(as: Type) // requires effort from Core team?
// or
sequence.compactMap(as: Type.self) // easy-to-achieve by user.

Proposed solution

extension Sequence {
    func compactMap<ElementOfResult>(as target: ElementOfResult.Type) -> [ElementOfResult] {
        compactMap({$0 as? ElementOfResult})
    }
}

Detailed design

If we dive a little deeper, then we could find a corner problem.

as(?|!)? // - operator is not a function.

It would be nice if we could use partial applying for it. In that case we could even dismiss this proposal.

static func as<S, T>(_ target: T.Type)(_ source: S)

After adding function above, we could downcast values easily.

sequence.compactMap(as?(String.self))

Source compatibility

Since we're only adding new functions that are implemented on top of existing functions, I guess, that this is not a problem.

Effect on ABI stability

Not sure.

Effect on API resilience

Not sure.

Alternatives considered

Could be done by user.

1 Like

That links to the forum main page, not to a specific thread.

Fixed.