繁体   English   中英

无法将协议传递给受约束的通用类型

[英]Cannot pass protocol to function with constrained generic type

如果您的函数具有受限于协议的泛型类型,则无法将协议类型的值传递给该函数:

protocol P {}

extension Int: P {}

func testP<T: P>(value: T) {}

// passing Int
let val = 0
testP(val)

// passing Int as P (protocol)
let valAsP: P = 0
testP(valAsP) // error: cannot invoke 'testP' with an argument list of type '(P)'

如果我将协议更改为类(并改为使用继承),则在两种情况下都将执行相同的功能。

另外,《 The Swift Programming Language》这本书说

声明中的冒号表示“ ...类型...”,

如果对于通用约束也是如此,我会认为这是一个错误。

因此,应该将其视为错误吗? 还是在任何情况下有此行为有用?

是的,根据有关“ 类型 ”定义的规范:

命名类型是一种在定义时可以被赋予特定名称的类型。 命名类型包括类,结构,枚举和协议

协议是有效的命名类型。

如果从testP删除P约束,则代码testP编译,这也得到了支持。

您可以通过将testP的签名更改为来解决您的情况

func testP(value: P) {}

适用于大多数情况。

顺便说一下,您的方案在C#中是可行的,其中的接口类似于Swift中的协议

我创建了问题SR-1324

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM