协议快速通用类

时间:2020-04-29 15:28:23

标签: swift generics

我如何为ModelProto这样的协议创建通用类,我尝试过这种方法,但是它不起作用

protocol ItemProto {
}

protocol ModelProto {
    var list: [ItemProto]? { get }
}

class Model<I: ItemProto>: ModelProto { // <-- ERROR !!!
    // Type 'Model<I>' does not conform to protocol 'ModelProto'
    // Do you want to add protocol stubs?
    // var list: [ItemProto]?
    var list: [I]? = nil // whay this line not conform? and how fix it?
}

我可以做这样的事情

    var list: [ItemProto]? {
        get { return __list__ }
    }
    private var __list__: [I]?

但是我认为这是一个不好的方法。有帮助吗?

协议ModelProto不具有通用性

class Model<I>必须必须使用<I>类方法才能将新项目构建为<I>

2 个答案:

答案 0 :(得分:0)

不要对Model使用通用结构:

protocol ItemProto { }

protocol ModelProto {
    var list: [ItemProto]? { get }
}

class Model {
    var list: [ItemProto]? = nil
}

您将能够存储符合ItemProto的任何对象。

答案 1 :(得分:0)

我们用关键字I定义了一个通用类,这意味着我ItemProto确认了ModelProto协议,但是在list中您将ItemProto定义为{{1 }}而不是I classType,因此编译器不会编译它。 您需要在ModelProto中定义一个类型,并将其直接用于ItemProto

protocol ModelProto {
    associatedtype ItemType: ItemProto
    var list: [ItemType]? { get }
}

现在,您告诉编译器,我得到了一个Type确认的ItemProto,因此您的ModelProto现在是通用协议。