Skip item when performing map in Swift?
Just replace map()
by 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? ...
returns nil
if the call throws an error, so thoseelements will be omitted in the result.
A self-contained example just for demonstration purposes:
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]
For Swift 3, replace ErrorType
by Error
.
For Swift 4 use compactMap