Drux Drux - 9 months ago 82
iOS Question

Find first element matching condition in Swift array (e.g. EKSource)

I would like to find the first

of type
with a "single"-line expression in Swift. Here is what I currently have:

let eventSourceForLocal =
eventStore.sources[eventStore.sources.map({ $0.sourceType })

Is there a better way of doing this (such as without mapping and/or with a generic version of

Answer Source

There's a version of indexOf that takes a predicate closure - use it to find the index of the first local source (if it exists), and then use that index on eventStore.sources:

if let index = eventStore.sources.indexOf({ $0.sourceType == .Local }) {
    let eventSourceForLocal = eventStore.sources[index]

Alternately, you could add a generic find method via an extension on SequenceType:

extension SequenceType {
    func find(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Generator.Element? {
        for element in self {
            if try predicate(element) {
                return element
        return nil

let eventSourceForLocal = eventStore.sources.find({ $0.sourceType == .Local })

(Why isn't this there already?)