flatMap 和“对成员的模糊引用”错误

flatMap and `Ambiguous reference to member` error

考虑以下代码:

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
    }
}

现在我想从 Records 的数组创建 Persons 的数组:

let records = // load file from bundle
let persons = records.flatMap(Person.init)

但我收到以下错误:

error: ambiguous reference to member 'init(name:age:)'

如果我将 failable initializer 移出扩展名,我仍然会遇到同样的错误。

我在这里遗漏了什么,这不是 flatMap 的正确用法吗?

编辑 - 已解决:

发现错误:从磁盘读取记录文件的代码,返回了错误的类型。一旦我解决了这个问题,错误就消失了。

为了这个工作

let persons = records.flatMap(Person.init)

传递给 flatMap 闭包的参数必须与 Person.init 接收到的类型相同,因此它必须是 PersonRecord.

然后记录必须是 PersonRecord 的列表,类似这样

let records: [PersonRecord] = []

现在可以使用了

let persons = records.flatMap(Person.init)    

大多数情况下 mapflatMap 中的 Ambiguous reference to member 是因为未指定 return 类型

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