swift - 如何创建具有通用函数扩展类型的协议(protocol)

标签 swift generics protocols swift-protocols

我正在尝试做一个带有通用函数的协议(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/

相关文章:

swift - 如何获取刚刚创建的 Realm 条目的值?

ios - 自定义运算符来简化 If-Let

ios - Swift 3 协议(protocol)和委托(delegate)方法?

reactjs - 为什么类型不能分配给泛型类型

cocoa - 声明委托(delegate)变量的正确方法是什么?

ios - 调用 reloadData 后 UITableView 动态单元格高度滚动到顶部

Java 泛型和通配符 : How to make this code compile?

generics - 为什么 '!=' 的使用被认为是模棱两可的,而 '=' 的类似用法却不是?

sockets - FIN 数据包乱序并覆盖?

protocols - OPC UA 协议(protocol)与 MQTT 协议(protocol)