flatMap and `Ambiguous reference to member` error

2019-07-26 08:35发布

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.

2条回答
闹够了就滚
2楼-- · 2019-07-26 08:43

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 })
查看更多
孤傲高冷的网名
3楼-- · 2019-07-26 08:50

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)    
查看更多
登录 后发表回答