Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3 flatMap和“对成员的引用不明确”错误_Swift3_Init_Flatmap - Fatal编程技术网

Swift3 flatMap和“对成员的引用不明确”错误

Swift3 flatMap和“对成员的引用不明确”错误,swift3,init,flatmap,Swift3,Init,Flatmap,考虑以下代码: 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 : Per

考虑以下代码:

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
    }
}
现在我想从
Record
s数组中创建一个
Person
s数组:

let records = // load file from bundle
let persons = records.flatMap(Person.init)
但我得到了以下错误:

error: ambiguous reference to member 'init(name:age:)'
如果我将
可失败的初始值设定项
移出扩展,我仍然会得到相同的错误

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

编辑-已解决:

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

这样才能起作用

let persons = records.flatMap(Person.init)
传递给
flatMap
闭包的参数必须与
Person.init
接收到的类型相同,因此必须是
PersonRecord

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

let records: [PersonRecord] = []
现在它起作用了

let persons = records.flatMap(Person.init)    
为了让它起作用

let persons = records.flatMap(Person.init)
传递给
flatMap
闭包的参数必须与
Person.init
接收到的类型相同,因此必须是
PersonRecord

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

let records: [PersonRecord] = []
现在它起作用了

let persons = records.flatMap(Person.init)    

map
flatMap
中,对成员的
不明确引用大多是因为未指定返回类型

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

map
flatMap
中,对成员的
不明确引用大多是因为未指定返回类型

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

假设
记录
的类型为
[PersonRecord]
,则编译对我来说很好。和所有奇怪的编译器错误一样,尝试清理你的构建文件夹——如果你在操场上,可以在一个完整的项目中尝试;我把代码移到了一个全新的游乐场,没有错误。我如何清理操场的构建文件夹(如果有的话)?我不相信你可以(至少不容易)在操场上。就我个人而言,我一开始会避免使用操场,因为它们臭名昭著地有缺陷——完整的项目是一个更好的Swift环境。嗯,我将整个操场代码(上面只是一个小片段)移动到了一个完整的项目中,但仍然会出现错误。所以还有别的事情发生了
Person
实际上确认了一个协议(
Nameable
,它只有一个属性:
name
),这会干扰吗?据我所知不是这样的-尽管在任何情况下,如果您能将代码缩减为a,并用该示例更新问题,这将非常有用。编译对我来说很好,假设
记录
的类型为
[PersonRecord]
。和所有奇怪的编译器错误一样,尝试清理你的构建文件夹——如果你在操场上,可以在一个完整的项目中尝试;我把代码移到了一个全新的游乐场,没有错误。我如何清理操场的构建文件夹(如果有的话)?我不相信你可以(至少不容易)在操场上。就我个人而言,我一开始会避免使用操场,因为它们臭名昭著地有缺陷——完整的项目是一个更好的Swift环境。嗯,我将整个操场代码(上面只是一个小片段)移动到了一个完整的项目中,但仍然会出现错误。所以还有别的事情发生了
Person
实际上确认了一个协议(
Nameable
,它只有一个属性:
name
),这会干扰吗?据我所知不是这样的——尽管在任何情况下,如果您能将代码缩减为a,并用该示例更新问题,这将非常有用。