flatMap和`歧义参照member`错误(flatMap and `Ambiguous refe

2019-09-29 01:30发布

考虑下面的代码:

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

现在,我想创建数组Person从一个数组S Record S:

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

但我得到以下错误:

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

如果我移动failable initializer了扩展的,我仍然得到同样的错误。

缺少什么我在这里,这是不是一个正确的用法flatMap

编辑 -解决:

发现错误:在记录读取的代码从磁盘文件,返回的错误类型。 一旦我固定的,错误就走开了。

Answer 1:

对于这个工作

let persons = records.flatMap(Person.init)

传递给所述PARAM flatMap闭合必须是由接收到的相同类型的Person.init ,所以它必须是PersonRecord

然后记录必须列表PersonRecord ,像这样的东西

let records: [PersonRecord] = []

现在,它的工作原理

let persons = records.flatMap(Person.init)    


Answer 2:

大多数倍的Ambiguous reference to membermapflatMap是因为未指定返回类型

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


文章来源: flatMap and `Ambiguous reference to member` error