Swift泛型类型选择不会传播

Swift泛型类型选择不会传播,swift,generics,types,Swift,Generics,Types,如果我理解正确,Swift可以通过不同的方法确定泛型的实际类型,包括通过返回类型进行匹配。相同(或类似)的机制用于消除重载函数的歧义。因此,这正如预期的那样起作用: func getValue<T>()->T? { return nil } func getValue()->Int? { return 13 } let b: Int? = getValue() 运行此命令时,c将为nil。事实上,编译器将选择要从getValue()调用的通用getV

如果我理解正确,Swift可以通过不同的方法确定泛型的实际类型,包括通过返回类型进行匹配。相同(或类似)的机制用于消除重载函数的歧义。因此,这正如预期的那样起作用:

func getValue<T>()->T? {
    return nil
}

func getValue()->Int? {
    return 13
}

let b: Int? = getValue()
运行此命令时,c将为
nil
。事实上,编译器将选择要从getValue()调用的通用getValue()实现,这不是我想要的。IMHO,当在getValue()的两个实现之间进行选择时,请求的返回类型应该通过第二个泛型传播,从而产生与第一个示例中相同的行为


我错过了什么?(Xcode 7.1)

您只是忘记了施放

func getValue<T>()->T? {
    return nil
}

func getValue()->Int? {
    return 13
}

let b: Int? = getValue() // 13

func getGetValue<T>()->T? {
    return getValue() as? T
}

let c: Int? = getGetValue() // 13
func getValue()->T?{
归零
}
func getValue()->Int?{
返回13
}
让b:Int?=getValue()//13
func getvalue()->T?{
将getValue()返回为?T
}
让c:Int?=getValue()//13

非常好的发现。我的猜测是,当存在另一层抽象时,按返回类型推断不起作用。一旦进入
getvalue
,编译器就不知道类型
T
是什么,所以第一个函数是唯一匹配的。@ZoffDino这也是我的猜测,但我不明白为什么编译器不能自下而上传播类型。从我的角度来看,它看起来像一个bug——但我不是一个编译人员。也许这种行为有一个完全合理的理由。为了以防万一,我将提交一份雷达文件。Swift博客中有一篇文章讨论了编译器在多大程度上证明了程序的正确性。我认为这与你的问题有些关联
func getValue<T>()->T? {
    return nil
}

func getValue()->Int? {
    return 13
}

let b: Int? = getValue() // 13

func getGetValue<T>()->T? {
    return getValue() as? T
}

let c: Int? = getGetValue() // 13