swift - Swift 泛型 T.Type 变为 T.Protocol
问题描述
斯威夫特 5.1
我正在编写一个具有泛型参数的类,它的T
一个方法接受一个类型作为参数,其中类型从T.Type
. 见foo1
下文:
public protocol P {
}
public class C: P {
}
public class X<T> {
public func foo1(_ t: T.Type) { // The function in question
}
public func foo2(_ t: P.Type) { // Note that this works as expected, but is not generic
}
}
public func test() {
let x = X<P>()
x.foo1(C.self) // ERROR Cannot convert value of type 'C.Type' to expected argument type 'P.Protocol'
x.foo2(C.self) // Works as expected, but is not generic
}
现在,上课foo1
时工作正常。T
但是,当T
是协议时(例如P
),Swift 似乎将我的函数签名从 重写T.Type
为T.Protocol
。
- 为什么这样做?
- 我如何
foo1
才能接受继承自的类型P
?
类X
在许多其他地方使用——对它的任何更改都不能限制或删除类参数,T
也不能减少X
的功能,也不能显式引用C
或P
。(限制T
排除不扩展的协议是可以接受的AnyObject
;不过,我不知道该怎么做。例如,创建一个X
添加处理协议能力的子类也可能是可以接受的T
,但我'也不知道该怎么做。)
为清楚起见,出于更复杂的项目原因,此类用于注册t
符合某些指定父级 ( ) 的类 ( ) 。T
(请注意,正在注册类,而不是其实例。)父级在创建时X
通过 type 参数给出。它适用于T
任何类的 a ,但我也希望它适用于T
任何协议的 a ——或至少适用T
于任何协议的 a P: AnyObject
,在这种情况下foo1
应该接受...的任何子类,P
就像它在T
是一类。
解决方案
即使C
是 P
, 但是C.Type != P.Type
, 所以错误。
但是泛型的工作方式有点不同,如下例所示:
public class X {
public func foo1<T>(_ t: T.Type) { // this way
}
public func foo3<T:P>(_ t: T.Type) { // or this way
}
public func foo2(_ t: P.Type) { // Note that this works as expected, but is not generic
}
}
public func test() {
let x = X()
x.foo1(C.self) // << works
x.foo3(C.self) // << works
x.foo2(C.self) // Works as expected, but is not generic
}
推荐阅读
- azure - 如何使用 Azure Bot 从网站中提取纯文本?
- docker - “/var/docker/server.pem: 没有这样的文件或目录”
- xml - 解析文件返回错误“线程'主'恐慌”
- system-verilog - 强制来自 UVM 驱动器的内部 DUT 信号
- php - 查询错误:列不能为空 - 查询无效
- python - 定义变量时出现类型错误
- javascript - 在 chrome speechSynthesis 中获取额外的声音列表
- javascript - 如何使用 longblob 列将输入图像保存在数据库中?
- python-3.x - Python 3.7,Feedparser 模块无法解析 BBC 天气提要
- php - 如何从 Laravel MySQL 循环条件聚合中检索 $key 和 $row 数据?