2016-09-21 77 views
3
的参数列表调用'methodName'

我无法获得此编译器的错误消息 “无法使用类型为'(value:T)' 的参数列表调用'getValueType' “如果(CMFStream.getValueType(价值:测试)=型){”无法使用类型为

public func readArray<T>() -> Array<T> 
{ 
    // ... 
    var retval: Array<T>; 
    let test: T; 
    if (CMFStream.getValueType(value: test) != type) { 
    // ... 
    } 
} 

我想我不明白泛型和模板之间的差异

在此先感谢

回答

3

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

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

这里有一个小例子:

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

func bar(b:Int) { 
} 

失败的原因吧接受一个I​​nt,但富可以通过任何类型。

有两种方法可以解决这个问题。

方法1个

制作吧通用:

func bar<V>(b:V) { 
} 

因此,如果调用

foo(f:1) 

编译器替换UInt,创建:

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

现在它需要一个接受Int酒吧,所以它取代VInt

func bar(b:Int) { 
} 

现在的类型是一致的,因此可以继续进行。

方法2

约束U

protocol P {} 

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

这就是说U是任何类型的符合协议P。所以,现在我们可以定义bar这样的:

func bar(b:P) { 
} 

定义一个bar接受任何符合协议P

现在无论占位U被替换,编译器知道它符合P,它总能找到一个bar接受的东西,符合P。编译器可以继续。

相关问题