如何创建具有通用函数扩展类型的协议

How to create a protocol with a generic function extending type

我正在尝试做一个带有通用函数的协议,其中 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 中,一切都可以使用抽象 class:

abstract class MyProtocol {
    abstract <T extends MainItem> T myFunc()
}

泛型不是满足您要求的方法。当您在协议中声明泛型函数时,泛型类型参数将意味着相同的函数适用于满足泛型类型限制的所有类型,但函数签名对于所有符合类型的类型仍然需要保持完整。

您要找的是 protocol with associated type。协议上的关联类型意味着符合类型可以决定使用什么具体类型来代替关联类型,因此允许您在不同的符合 类.

中使用不同的关联类型
protocol MyProtocol {
    associatedtype MyType: MainItem
    func myFunc() -> MyType
}

class ClassA: MyProtocol {
    func myFunc() -> Item1 {
        return Item1()
    }
}

class ClassB: MyProtocol {
    func myFunc() -> Item2 {
        return Item2()
    }
}