You can use flatMap(_:)
in a similar manner to map(_:)
in order to create an array by applying a transform to a sequence's elements.
extension SequenceType {
public func flatMap<T>(@noescape transform: (Self.Generator.Element) throws -> T?) rethrows -> [T]
}
The difference with this version of flatMap(_:)
is that it expects the transform closure to return an Optional value T?
for each of the elements. It will then safely unwrap each of these optional values, filtering out nil
– resulting in an array of [T]
.
For example, you can this in order to transform a [String]
into a [Int]
using Int
's failable String
initializer, filtering out any elements that cannot be converted:
let strings = ["1", "foo", "3", "4", "bar", "6"]
let numbersThatCanBeConverted = strings.flatMap { Int($0) }
print(numbersThatCanBeConverted) // [1, 3, 4, 6]
You can also use flatMap(_:)
's ability to filter out nil
in order to simply convert an array of optionals into an array of non-optionals:
let optionalNumbers : [Int?] = [nil, 1, nil, 2, nil, 3]
let numbers = optionalNumbers.flatMap { $0 }
print(numbers) // [1, 2, 3]