2016-03-29 7 views
5

Ich verwende eine Karte auf ein Wörterbuch, das eine try enthält. Ich möchte die Iteration überspringen, wenn das zugeordnete Element ungültig ist.Artikel überspringen, wenn Karte in Swift durchgeführt wird?

Zum Beispiel:

func doSomething<T: MyType>() -> [T] 
    dictionaries.map({ 
     try? anotherFunc($0) // Want to keep non-optionals in array, how to skip? 
    }) 
} 

In dem obigen Beispiel, wenn anotherFunc kehren nil, wie die aktuelle Iteration zu entkommen und zum nächsten weitergehen? Auf diese Weise würde es nicht die Elemente enthalten, die nil sind. Ist das möglich?

Antwort

15

Ersetzen Sie einfach map() von flatMap():

extension SequenceType { 
    /// Returns an `Array` containing the non-nil results of mapping 
    /// `transform` over `self`. 
    /// 
    /// - Complexity: O(*M* + *N*), where *M* is the length of `self` 
    /// and *N* is the length of the result. 
    @warn_unused_result 
    public func flatMap<T>(@noescape transform: (Self.Generator.Element) throws -> T?) rethrows -> [T] 
} 

try? ... kehrt nil, wenn der Aufruf einen Fehler wirft, so dass diese Elemente werden in das Ergebnis einbezogen werden.

Ein in sich geschlossenes Beispiel nur zu Demonstrationszwecken:

enum MyError : ErrorType { 
    case DivisionByZeroError 
} 

func inverse(x : Double) throws -> Double { 
    guard x != 0 else { 
     throw MyError.DivisionByZeroError 
    } 
    return 1.0/x 
} 

let values = [ 1.0, 2.0, 0.0, 4.0 ] 
let result = values.flatMap { 
    try? inverse($0) 
} 
print(result) // [1.0, 0.5, 0.25] 

Für Swift 3,ErrorType durch Error ersetzen.

+0

Danke, dass ich 'flatMap' entdeckt habe! Ich habe gerade bemerkt, dass es nicht mit Wörterbüchern funktioniert. – TruMan1

+2

@ TruMan1: Ich bin mir ziemlich sicher, dass es so ist. Sowohl map als auch flatMap können auf ein Wörterbuch angewendet werden. Die Schließung wird mit Schlüssel/Wert als Argumente aufgerufen. –

+0

Es tut dir wirklich leid, thx wieder !! – TruMan1