什么是_&引用;在swift错误消息中键入mean?

什么是_&引用;在swift错误消息中键入mean?,swift,generics,type-inference,Swift,Generics,Type Inference,有时在使用泛型时,我会收到一条错误消息,将“\u1”作为参数。似乎没有记录在案。这是什么意思 例如,我得到了一个错误: Cannot convert value of type 'JawDroppingFeat<Superhero>' to closure result type 'JawDroppingFeat<_>' 无法将“JawDroppingFeat”类型的值转换为闭包结果类型“JawDroppingFeat” 当我尝试编译时: protocol Super

有时在使用泛型时,我会收到一条错误消息,将“\u1”作为参数。似乎没有记录在案。这是什么意思

例如,我得到了一个错误:

Cannot convert value of type 'JawDroppingFeat<Superhero>' to closure result type 'JawDroppingFeat<_>'
无法将“JawDroppingFeat”类型的值转换为闭包结果类型“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)
        }
    }
  }
}
协议超级英雄类型{
超级大国
}
结构JawDroppingFeat:任意{
让主题:超级英雄
让超级大国使用:超级英雄,超级大国
静态变量:Gen{
得到{
return Gen.zip(Superhero.arbitral,Superhero.Superpower.arbitral)
.map{(x:超级英雄,y:超级英雄,超级大国)在
跳JawDroppingFeat(主题:x,使用的超级力量:y)
}
}
}
}
Gen和任意类型来自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 }
}
公共结构生成{
公共静态函数zip(gen1:SwiftCheck.Gen,gen2:SwiftCheck.Gen)->SwiftCheck.Gen
公共功能图(f:A->B)->SwiftCheck.Gen
}
公共协议任意{
公共静态变量:SwiftCheck.Gen{get}
}
我认为
与斯威夫特未能推断出类型参数有关,而不是与克里斯·拉特纳(Chris Lattner)向我退缩的图像有关。但它是否有更精确(并有记录)的含义

编辑
我目前最好的理论是,当Swift无法推断类型参数时,而不是立即失败,它会分配一个null(
\uu
)类型,这会导致下游某个点的实际编译错误,该点的类型不兼容(在我的情况下,参数映射到
.map
)已传递。

表示参数返回值中的类型信息不完整

在本例中,.map函数将返回一个您未指定嵌入类型的通用JawDroppingFeat

我想你是想写信吧

 JawDroppingFeat<SuperHero>(subject: x, superpowerUsed: y)
JawDroppingFeat(主题:x,使用的超级能力:y)

一般来说,我的经验是,此错误消息似乎是反向构造的。“无法将X类型的值转换为Y”似乎意味着“您提供了Y,但需要的是X”。

几乎可以。JawDroppingFeat类型在没有显式注释的情况下推断良好。问题是,在调用
Gen
类型的静态
.zip
函数时,我没有对其进行注释。由于参数使用函数的类型参数而不是结构参数,因此无法从Gen结构推断具体类型。这表现为需要
\u
作为
.map
调用的参数……如果您已经解决了这个问题,那么如果您将解决方案代码作为答案发布,那就太酷了。