ios - 为什么协议的存在元类型会丢失继承信息?
问题描述
我有一个通用函数,我在其中传递protocol
类型,并根据传递的类型返回一个 required struct
。如果我对泛型设置协议约束,即使传递的协议符合它,我也会收到错误。
protocol BaseProtocol {}
protocol ProtocolA: BaseProtocol {}
protocol ProtocolB: BaseProtocol {}
struct StructA: ProtocolA {}
struct StructB: ProtocolB {}
当我用这样的约束定义我的函数时:
func getStruct<T: BaseProtocol>(type: T.Type) -> T {
switch type {
case is ProtocolA.Protocol:
return StructA() as! T
case is ProtocolB.Protocol:
return StructB() as! T
default:
fatalError("Unknown Type")
}
}
let result = getStruct(type: ProtocolA.self)
print(type(of: result))
它不起作用并生成以下错误:
如果我删除 BaseProtocol 约束一切正常:
func getStruct<T: Any>(type: T.Type) -> T {
switch type {
case is ProtocolA.Protocol:
return StructA() as! T
case is ProtocolB.Protocol:
return StructB() as! T
default:
fatalError("Unknown Type")
}
}
有没有其他方法可以设置该约束?我在这里做错了吗?
解决方案
事实上,您的getStruct
方法type
参数中没有协议类型。你得到一个struct
,enum
或者class
那个符合BaseProtocol
您可以查看以下内容以获取更多信息: 答案:为什么我不能将 Protocol.Type 传递给通用 T.Type 参数?
推荐阅读
- java - 确定图像 url 的文件扩展名
- javascript - 在 Windows、Mac 和 Linux 上分发 Electron 应用程序
- python - How to disable checkbox after change in another field in django template?
- c++ - std::filesystem::directory_iterator 链接器问题 (C++17)
- r - Pandoc 无法从网络驱动器获取
- django - 使用另一种身份验证方法绕过 Django 管理员登录
- sql - PostgreSQL - SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中
- javascript - 如何使用打字稿读取 json 数据?
- android - 从代码触发 PeriodicWorkRequest
- oracle - 在 Oracle 中优化 TO_TIMESTAMP() 查询