在此代码中:

class Foo {
}

func go(input: Foo) {
    print("Non-generic called")
}

func go<T>(input: T) {
    print("Generic called")
}

var foo:Foo = Foo()
go(foo) // Non-generic called

我只是好奇为什么非泛型版本会被调用而不是泛型版本?编译器只是将特定类型优先于泛型吗?

最佳答案

编译器优先处理最受约束的函数。因此,与需要子类型的where子句匹配的函数将胜过与需要父类型的where子句匹配的函数。与where子句匹配的函数将胜过不匹配的函数。显式调用其类型的函数将胜过仅与泛型匹配的函数。具体的规则相当复杂(在某些情况下,当事情处于边缘时似乎是a little ad hoc),但总的来说,这就是目的。
你可以认为上面是:

// Any T
func go<T>(input: T) {
    print("Generic called")
}

// A very constrained T, so clearly you wanted to override.
func go<T where T == Foo>(input: T) {
    print("Non-generic called")
}

关于swift - 了解常规版本和通用版本之间的函数调用优先级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34861755/

10-12 21:28