当涉及泛型时,Swift无法找到重载
我有以下代码:当涉及泛型时,Swift无法找到重载,swift,generics,overload-resolution,Swift,Generics,Overload Resolution,我有以下代码: protocol MyEnum { } class MyClass { func append(_ value: UInt8) { print("uint8 \(value)") } func append(_ value: UInt16) { print("uint16 \(value)") } func append<T: MyEnum>(_ value: T) { p
protocol MyEnum {
}
class MyClass {
func append(_ value: UInt8) {
print("uint8 \(value)")
}
func append(_ value: UInt16) {
print("uint16 \(value)")
}
func append<T: MyEnum>(_ value: T) {
print("myenum \(value)")
}
}
let c = MyClass()
func appendAny<T>(_ value: T) {
switch value {
case let u8 as UInt8:
c.append(u8)
case let u16 as UInt16:
c.append(u16)
case let myenum as MyEnum:
c.append(myenum)
default:
assert(false)
}
}
协议MyEnum{
}
类MyClass{
func append(u值:UInt8){
打印(“uint8\(值)”)
}
func append(u值:UInt16){
打印(“uint16\(值)”)
}
func append(u值:T){
打印(“myenum\(值)”)
}
}
设c=MyClass()
func appendAny(u值:T){
开关量{
案例编号u8为UInt8:
c、 追加(u8)
案例编号u16作为UInt16:
c、 附加(u16)
案例让myenum作为myenum:
c、 附加(myenum)
违约:
断言(假)
}
}
编译器报告行c.append(myenum)
stating的错误
无法使用类型为(MyEnum)的参数列表调用“append”
请向我解释为什么会发生这种情况,以及在这种情况下正确的解决方案是什么。我想保留我的重载,因为当使用具体的
MyEnum
实例调用时,所有的工作都很好。正如Martin在他的评论中指出的,您应该将最终的append()
重载更改为:
func append(_ value: MyEnum) {
print("myenum \(value)")
}
因为您希望将该值视为“协议的实例”,而不是“恰好符合协议的具体类型的实例”。具有协议类型的实例也不是符合该协议的具体类型
另一个注意事项:既然您没有真正使用泛型约束或任何类型为t
的编译时属性(仅限运行时强制转换),为什么不将appendAny
更改为:
func appendAny(_ value: Any) {
switch value {
case let u8 as UInt8:
c.append(u8)
case let u16 as UInt16:
c.append(u16)
case let myenum as MyEnum:
c.append(myenum)
default:
assert(false)
}
}
这是协议的另一个变体:协议不符合自身。将第三个变量更改为
func-append(value:MyEnum)
,以使其可编译。谢谢@MartinR的帮助。我想我对泛型append
方法的设计有点过头了。