Search code examples
iosswiftswift2ios9eventkit

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


I would like to find the first EKSource of type EKSourceType.Local with a "single"-line expression in Swift. Here is what I currently have:

let eventSourceForLocal = 
    eventStore.sources[eventStore.sources.map({ $0.sourceType })
        .indexOf(EKSourceType.Local)!]

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


Solution

  • 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?)