koen
koen

Reputation: 5729

flatMap and `Ambiguous reference to member` error

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 Persons from an array of Records:

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.

Upvotes: 1

Views: 2816

Answers (2)

Jeremy Piednoel
Jeremy Piednoel

Reputation: 406

Most of the times the Ambiguous reference to member in a map or flatMap is because the return type isn't specified

array.flatMap({ (item) -> ObjectToReturn? in })

Upvotes: 1

Luca Angeletti
Luca Angeletti

Reputation: 59496

For this to work

let persons = records.flatMap(Person.init)

the param passed to the flatMap closure must be the same type received by Person.init, so it must be PersonRecord.

Then records must be a list of PersonRecord, something like this

let records: [PersonRecord] = []

Now it works

let persons = records.flatMap(Person.init)    

Upvotes: 3

Related Questions