什么是_&引用;在swift错误消息中键入mean?
有时在使用泛型时,我会收到一条错误消息,将“\u1”作为参数。似乎没有记录在案。这是什么意思 例如,我得到了一个错误:什么是_&引用;在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
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
调用的参数……如果您已经解决了这个问题,那么如果您将解决方案代码作为答案发布,那就太酷了。