Consider the following code:
typealias PersonRecord = [String : AnyObject]
struct Person {
let name: String
let age: Int
public init(name: String, age: Int) {
self.name = name
self.age = age
}
}
extension Person {
init?(record : PersonRecord) {
guard let name = record["name"] as? String,
let age = record["age"] as? Int else {
return nil
}
self.name = name
self.age = age
}
}
Now I want to create an array of Person
s from an array of Record
s:
let records = // load file from bundle
let persons = records.flatMap(Person.init)
But I get the following error:
error: ambiguous reference to member 'init(name:age:)'
If I move the failable initializer
out of the extension, I still get the same error.
What am I missing here, is this not a correct usage of flatMap
?
EDIT - solved:
Found the error: the code that read in the records file from disk, returned the wrong type. Once I fixed that, the error went away.
Most of the times the
Ambiguous reference to member
in amap
orflatMap
is because the return type isn't specifiedFor this to work
the param passed to the
flatMap
closure must be the same type received byPerson.init
, so it must bePersonRecord
.Then records must be a list of
PersonRecord
, something like thisNow it works