gpt4 book ai didi

快速不一致的通用协议(protocol)限制

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

在将参数传递给具有协议(protocol)限制的通用函数时,我似乎遇到了编译器不一致的问题。我可以传递一个具体的参数,但不能传递一个作为协议(protocol)类型的参数

protocol Selectable {
func select()
}

protocol Log : Selectable {
func write()
}

class DefaultLog : Log {
func select() {
print("selecting")
}
func write() {
print("writing")
}
}

let concrete = DefaultLog()
let proto: Log = DefaultLog()

func myfunc<T: Selectable>(arg: T) {
arg.select()
}

myfunc(concrete) // <-- This works
myfunc(proto) // <-- This causes a compiler error
proto.write() // <-- This works fine

编译器报告:

error: cannot invoke 'myfunc' with an argument list of type '(Log)'
myfunc(proto)
^
note: expected an argument list of type '(T)'
myfunc(proto)
^

如果我将函数限制为 Selectable 或 Log 协议(protocol),它仍然会失败。

这是编译器错误吗?有什么想法吗?

最佳答案

如果您使用的是协议(protocol),则它不需要是通用的:

func myfunc(arg: Selectable) {
arg.select()
}

我认为 T 需要是泛型的具体类型。

关于快速不一致的通用协议(protocol)限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37441012/

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