swift - 具有通用方法的 Swift 协议:无效的重新声明实现
问题描述
我在 Swift 中玩一些协议/通用的东西,我很好奇为什么下面的代码拒绝被编译:
protocol MyProtocol {
func value<T>() -> T
}
class StringImpl: MyProtocol {
var string: String
init() {
self.string = "..."
}
init(string: String) {
self.string = string
}
func value<String>() -> String {
return self.string as! String
}
}
class BoolImpl: MyProtocol {
var value: Bool
init() {
self.value = false
}
init(value: Bool) {
self.value = value
}
func value<Bool>() -> Bool {
return self.value as! Bool
}
}
有特定错误
error: invalid redeclaration of 'value()'
func value<Bool>() -> Bool {
这可能意味着我不能有不同的协议泛型方法实现,但我没有看到明确的原因。
(我不是说强制类型转换为现有的通用类型阴影)
PS 对于那些好奇的人,我可能会说我正在尝试制作不会与相关类型混淆并且在某种程度上仍然是通用的协议。
解决方案
你没有问题,错误是var value
,重新声明一个名称为 的函数func value<Bool>
,我只是更改了变量名并且它起作用了,错误清楚地表明
错误:“值()”的无效重新声明
class BoolImpl: MyProtocol {
var bool: Bool
init() {
self.bool = false
}
init(value: Bool) {
self.bool = value
}
func value<Bool>() -> Bool {
return self.bool as! Bool
}
}
推荐阅读
- python-3.x - 会话 id 下的 Firefox 中的 Selenium 测试
- android - 根据视图焦点或滚动在 ContraintLayout 内折叠布局
- ios - Airwatch 目录和 Airwatch Tunnen URL 方案
- sql - 在两点之间使用一组日期(星期日)进行子查询
- reactjs - *React-table* 第二页不显示数据
- angular2-forms - Angular Datatable 未在第一次加载时加载
- android - ConstraintLayout ListView RTL 有些行不是 RTL
- javascript - 无法在three.js中将纹理映射到网格
- gnuplot - 如何在gnuplot中绘制由部件定义的表面
- angular - Angular 6 - 接收电子邮件的自定义验证器始终返回 true