我有以下代码:
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
实例调用时,一切正常。
答案 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)
}
}