17

が含まれている辞書にマップを適用してtryいます。マップされたアイテムが無効な場合は、反復をスキップしたいと思います。

例えば:

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

上記のサンプルで、 がanotherFunc返された場合nil、現在の反復をエスケープして次の反復に進むにはどうすればよいですか? そうすれば、あるアイテムは含まれませんnil。これは可能ですか?

4

1 に答える 1

29

に置き換えるだけ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]

Swift 3 の場合は、ErrorType置き換えますError

Swift 4用compactMap

于 2016-03-29T19:33:20.017 に答える