当前位置 : 主页 > 大数据 > 区块链 >

带有Protocol.Type的Swift泛型

来源:互联网 收集:自由互联 发布时间:2021-06-22
我在 Swift中遇到泛型问题(3): 我从服务器获得不同类的不同数据,实现相同的协议,我需要将它们放入带有泛型的类(例如Array)中. 我不知道数据属于哪个类,所以我需要使用协议.所以我有
我在 Swift中遇到泛型问题(3):

我从服务器获得不同类的不同数据,实现相同的协议,我需要将它们放入带有泛型的类(例如Array)中.

我不知道数据属于哪个类,所以我需要使用协议.所以我有以下结构:

我的协议:

protocol MyProtocol {
    // some protocol stuff
}

一些实现协议的类

class MyProtocolImpl1: MyProtocol{
    // some class stuff
}

class MyProtocolImpl2: MyProtocol {
    // some class stuff
}
....

通用类:

final class MyGenericsClass<T: MyProtocol> {
    // some class stuff
}

现在我想以这种方式使用这个类:

func createClass<T>(model: T.Type) -> MyGenericClass<T> {
    let myClass = MyGenericClass<T>()
    return myClass
}

...

编辑

func getClass() -> MyProtocol.Type {
     return MyProtocolImpl1.self
}

let impl1 = getClass()
let impl2 = MyProtocolImpl2.self

let createdClass = createClass(impl1) //not working
let createdClass = createClass(impl2) //working

做createClass(impl1)我收到此错误:

无法使用类型为'(MyProtocol.Type)’的参数列表调用’createClass’

将MyProtocol更改为类可以解决问题但是我不能确定从它继承的每个类都实现了所需的方法.

有人有一些想法如何解决这个问题?

答案是你不能这样做. MyProtocol.self不是具体类型,因此它不能符合MyProtocol.当你的函数在T:MyProtocol之后需要一个具体的类型T时,你不能传递MyProtocol.

以这种方式思考;如果我要添加静态函数,doFoo()到MyProtocol,并初始化GenericClass< MyProtocol>并决定在某个方法中调用MyProtocol.doFoo(),它会调用什么函数?它没有任何意义,因为MyProtocol不是具体类型(即类,结构或枚举),它是一个协议.

关于你评论的说明:

The problem is that I do not know if it is ClassA or ClassB or ClassX. I just know that it is a subclass of MyProtocol

这是你犯错的地方. “MyProtocol的子类”没有意义,因为MyProtocol不是一个类.

这个怎么样?您最终使用AnyObject,但您可以将其强制转换为MyGenericClass< T>以后当你知道T.

extension MyProtocol
{
    static func createMyGenericClass() -> AnyObject
    {
        return MyGenericClass<Self>()
    }
}

func createClass(_ modelType: MyProtocol.Type) -> AnyObject
{
    return modelType.createMyGenericClass()
}

您还可以使MyGenericClass从某个基类继承,并为MyProtocol.Type存储变量.这样,您可以使用MyProtocol conformee类型中的特定功能.

网友评论