涉及泛型时,Swift无法找到重载

时间:2016-12-05 19:18:54

标签: 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) {
        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)
    }
}

编译器报告错误行c.append(myenum)

  

无法使用类型(MyEnum)

的参数列表调用'append'

请向我解释为什么会发生这种情况,在这种情况下,正确的解决方案是什么。我希望保留我的重载,因为当使用具体的MyEnum实例调用时,一切正常。

1 个答案:

答案 0 :(得分:1)

正如Martin在评论中指出的那样,您应该将最终的append()重载更改为:

func append(_ value: MyEnum) {
    print("myenum \(value)")
}

因为您希望将值视为&#34;协议实例&#34;而不是符合协议的具体类型的实例&#34;。具有协议类型的实例不是 符合该协议的具体类型。

另一个注意事项:由于您并未真正使用泛型约束或T类型的任何编译时属性(仅运行时强制转换),为什么不将appendAny更改为:< / p>

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)
    }
}