我正在尝试做一个带有通用函数的协议(protocol),其中 T 不仅等于类型,而且扩展了它。
class MainItem {}
class Item1: MainItem {}
class Item2: MainItem {}
protocol MyProtocol {
func myFunc<T: MainItem>() -> T // T extends MainItem
}
class ClassA: MyProtocol {
func myFunc() -> Item1 { // not MainItem
return Item1()
}
}
class ClassB: MyProtocol {
func myFunc() -> Item2 { // not MainItem
return Item2()
}
}
但是我得到了这个错误
Type 'ClassA' does not conform to protocol 'MyProtocol'
因为 Item1
不等于 MainItem
(它扩展了它)。如何让它发挥作用?
例如,在 Java 中,一切都可以使用抽象类来完成:
abstract class MyProtocol {
abstract <T extends MainItem> T myFunc()
}
最佳答案
泛型不是满足您的要求的方法。当您在协议(protocol)中声明泛型函数时,泛型类型参数将意味着同一函数适用于满足泛型类型限制的所有类型,但对于所有符合类型的函数签名仍然需要保持完整。
您正在寻找的是 protocol with associated type .协议(protocol)上的关联类型意味着符合类型可以决定使用什么具体类型来代替关联类型,因此允许您在不同的符合类中使用不同的关联类型。
protocol MyProtocol {
associatedtype MyType: MainItem
func myFunc() -> MyType
}
class ClassA: MyProtocol {
func myFunc() -> Item1 {
return Item1()
}
}
class ClassB: MyProtocol {
func myFunc() -> Item2 {
return Item2()
}
}
关于swift - 如何创建具有通用函数扩展类型的协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55612416/