map
sequence
rethrows
func cast<T, U: T>(_ x: T, _ type: U.Type) throws -> U { ... }
var catArray: [Cat]? = try? animalArray.map { try cast($0, Cat.self) }