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,并用该示例更新问题,这将非常有用。