Swift 无法调用';方法名称';具有类型为的参数列表

Swift 无法调用';方法名称';具有类型为的参数列表,swift,generics,Swift,Generics,我无法理解此编译器错误消息的要点 无法使用类型为“(值:T)”的参数列表调用“getValueType” 对于行“if(CMFStream.getValueType(value:test)!=type){” public func readArray()->Array { // ... var-retval:数组; let测试:T; if(CMFStream.getValueType(值:test)!=type){ // ... } } 我想我不理解泛型和模板之间的区别。您正在将类型为t的对象

我无法理解此编译器错误消息的要点 无法使用类型为“(值:T)”的参数列表调用“getValueType” 对于行“if(CMFStream.getValueType(value:test)!=type){”

public func readArray()->Array
{
// ...
var-retval:数组;
let测试:T;
if(CMFStream.getValueType(值:test)!=type){
// ...
}
}

我想我不理解泛型和模板之间的区别。

您正在将类型为
t
的对象传递给
getValueType
t
是一个无约束的泛型类型,这意味着在编译时它可以是范围内已知的任何类型。它有一个确定的类型,但编译器不知道是什么该类型是。
T
是它的占位符

当它遇到调用
getValueType
的行,该行带有
T
类型的参数时,它会寻找一种方法来满足该要求。您看到的错误表明它没有找到这样做的方法

下面是一个简单的例子:

func foo<U>(f:U) {
    bar(b:f)
}

func bar(b:Int) {
}
编译器将
U
替换为
Int
,创建:

func foo(f:Int) {
    bar(b:f)
}
现在,它需要一个接受
Int
的条,因此它将
V
替换为
Int
,以提供

func bar(b:Int) {
}
现在,类型是一致的,因此可以继续

方法2

约束
U

protocol P {}

func foo<U:P>(f:U) {
    bar(b:f)
}
这定义了一个
,它接受符合协议
p
的任何内容

现在,无论用什么替换占位符
U
,编译器都知道它符合
p
,并且它总能找到一个
,它接受符合
p
的内容。编译器可以继续

func foo(f:Int) {
    bar(b:f)
}
func bar(b:Int) {
}
protocol P {}

func foo<U:P>(f:U) {
    bar(b:f)
}
func bar(b:P) {
}