偶尔在使用泛型时,我会收到一条错误消息,将"_“作为参数。它似乎没有记录在案。什么意思?
作为示例,我得到了以下错误:
Cannot convert value of type 'JawDroppingFeat<Superhero>' to closure result type 'JawDroppingFeat<_>'当我尝试编译时:
protocol SuperheroType {
typealias Superpower
}
struct JawDroppingFeat<Superhero: SuperheroType where Superhero: Arbitrary, Superhero.Superpower: Arbitrary>: Arbitrary {
let subject: Superhero
let superpowerUsed: Superhero.Superpower
static var arbitrary: Gen<JawDroppingFeat<Superhero>> {
get {
return Gen.zip(Superhero.arbitrary, Superhero.Superpower.arbitrary)
.map{ (x: Superhero, y: Superhero.Superpower) in
JawDroppingFeat(subject: x, superpowerUsed: y)
}
}
}
}Gen和are类型来自SwiftCheck,相关声明如下:
public struct Gen<A> {
public static func zip<A, B>(gen1: SwiftCheck.Gen<A>, _ gen2: SwiftCheck.Gen<B>) -> SwiftCheck.Gen<(A, B)>
public func map<B>(f: A -> B) -> SwiftCheck.Gen<B>
}
public protocol Arbitrary {
public static var arbitrary: SwiftCheck.Gen<Self> { get }
}我认为<_>与swift未能推断出类型参数有关,而不是Chris Lattner向我退缩的图像。但是它有没有更精确的(有记录的)含义呢?
编辑
我目前最好的理论是,当Swift无法推断出类型参数时,它不会立即失败,而是分配一个空(_)类型,这会导致在传递不兼容类型(在我的例子中,是传递给.map的参数)的某个点上发生实际的编译错误。
发布于 2016-01-17 01:14:31
这意味着参数的返回值中有不完整的类型信息。
在本例中,.map函数将返回一个您没有指定嵌入式类型的泛型JawDroppingFeat。
我猜你是想写
JawDroppingFeat<SuperHero>(subject: x, superpowerUsed: y)发布于 2016-01-17 01:24:54
一般来说,我的经验是这个错误消息似乎是向后构造的。“无法将X类型的值转换为Y”似乎意味着“您提供了Y,但需要的是X。”
https://stackoverflow.com/questions/34827889
复制相似问题