如何使用泛型函数扩展类型创建协议

3
我正在尝试使用通用函数进行协议操作,其中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()
    }
}

但是我遇到了这个错误:

类型'ClassA'不符合协议'MyProtocol'

因为Item1不等于MainItem(它会展开)。如何使其正常工作?

例如,在Java中,所有内容都可以使用抽象类完成:

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

2
@Dimple请不要添加无关的标签。iOS标签应该仅用于特别涉及iOS平台的问题,但是这个问题显然与平台无关,只涉及Swift编程语言的一个特性。 - Dávid Pásztor
1个回答

4
Generics并不适合您的需求。当您在协议中声明一个泛型函数时,泛型类型参数将意味着同一函数适用于满足泛型类型限制的所有类型,但函数签名仍需要对所有符合条件的类型保持完整。
您需要的是一个带有关联类型的协议。协议上的关联类型意味着符合条件的类型可以决定在相关类型的位置使用哪种具体类型,因此允许您在不同的符合类中使用不同的相关类型。
protocol MyProtocol {
    associatedtype MyType: MainItem
    func myFunc() -> MyType
}

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

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

非常感谢!这正是我在寻找的! - Vergiliy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接