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
}
}
现在我想从 Record
s 的数组创建 Person
s 的数组:
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)
大多数情况下 map
或 flatMap
中的 Ambiguous reference to member
是因为未指定 return 类型
array.flatMap({ (item) -> ObjectToReturn? in })
考虑以下代码:
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:)'
如果我将 failable initializer
移出扩展名,我仍然会遇到同样的错误。
我在这里遗漏了什么,这不是 flatMap
的正确用法吗?
编辑 - 已解决:
发现错误:从磁盘读取记录文件的代码,返回了错误的类型。一旦我解决了这个问题,错误就消失了。
为了这个工作
let persons = records.flatMap(Person.init)
传递给 flatMap
闭包的参数必须与 Person.init
接收到的类型相同,因此它必须是 PersonRecord
.
然后记录必须是 PersonRecord
的列表,类似这样
let records: [PersonRecord] = []
现在可以使用了
let persons = records.flatMap(Person.init)
大多数情况下 map
或 flatMap
中的 Ambiguous reference to member
是因为未指定 return 类型
array.flatMap({ (item) -> ObjectToReturn? in })