Swift 无法调用';方法名称';具有类型为的参数列表
我无法理解此编译器错误消息的要点 无法使用类型为“(值:T)”的参数列表调用“getValueType” 对于行“if(CMFStream.getValueType(value:test)!=type){”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的对象
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) {
}