gpt4 book ai didi

swift - 无法使用类型的参数列表调用 'methodName'

转载 作者:搜寻专家 更新时间:2023-10-31 22:30:20 25 4
gpt4 key购买 nike

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

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

我想我不明白泛型和模板之间的区别。

最佳答案

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

当它遇到使用类型为 T 的参数调用 getValueType 的行时,它会寻找满足该要求的方法。您看到的错误表明它没有找到执行此操作的方法。

这是一个最小的例子:

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

func bar(b:Int) {
}

这失败了,因为 bar 接受一个 Int,但 foo 可以传递任何类型。

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

方法一

使栏通用:

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

所以如果你打电话

foo(f:1)

编译器将 U 替换为 Int,创建:

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

现在它需要一个接受 Int 的条形图,因此它将 V 替换为 Int 以给出

func bar(b:Int) {
}

现在类型是一致的,所以它可以继续。

方法二

约束U:

protocol P {}

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

这表示 U 是任何符合协议(protocol) P 的类型。所以现在我们可以这样定义 bar:

func bar(b:P) {
}

这定义了一个 bar 接受任何符合协议(protocol) P 的内容。

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

关于swift - 无法使用类型的参数列表调用 'methodName',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39623305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com