当涉及泛型时,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
方法的设计有点过头了。