2016-03-29 8 views
5

私はtryを持つ辞書にマップを適用しています。マップされた項目が無効な場合は、繰り返しをスキップします。例えばSwiftで地図を表示するときに項目をスキップしますか?

:上記サンプルで

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

、現在の反復を脱出し、次へ移動する方法anotherFunc戻りnil、もし?そうすれば、nilという項目は含まれません。これは可能ですか?

答えて

15

だけmap()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? ...戻りnilを。ちょうどデモの目的のために

自己完結型の例:

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] 

スウィフト3、についてはErrorErrorTypeを交換してください。

+0

「flatMap」を発見してくれてありがとう!私はそれが辞書で動作しないことに気づいた。 – TruMan1

+2

@ TruMan1:私は確信しています。 'map'と' flatMap'の両方を辞書に適用できます。クロージャはkey/valueを引数として呼び出されます。 –

+0

もう一度申し訳ありませんが、再びthx! – TruMan1

関連する問題