bea*_*eal 6 generics protocols swift
我在Swift中遇到泛型问题(3):
我从服务器获得不同类的不同数据,实现相同的协议,我需要将它们放入具有泛型的类(例如Array)中.
我不知道数据属于哪个类,所以我需要使用协议.所以我有以下结构:
我的协议:
protocol MyProtocol {
// some protocol stuff
}
Run Code Online (Sandbox Code Playgroud)
一些实现协议的类
class MyProtocolImpl1: MyProtocol{
// some class stuff
}
class MyProtocolImpl2: MyProtocol {
// some class stuff
}
....
Run Code Online (Sandbox Code Playgroud)
通用类:
final class MyGenericsClass<T: MyProtocol> {
// some class stuff
}
Run Code Online (Sandbox Code Playgroud)
现在我想以这种方式使用这个类:
func createClass<T>(model: T.Type) -> MyGenericClass<T> {
let myClass = MyGenericClass<T>()
return myClass
}
...
Run Code Online (Sandbox Code Playgroud)
编辑
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
Run Code Online (Sandbox Code Playgroud)
这样做createClass(impl1)我得到这个错误:
cannot invoke 'createClass' with an argument list of type '(MyProtocol.Type)'
将MyProtocol更改为类可以解决问题但是我不能确定从它继承的每个类都实现了所需的方法.
有人有一些想法如何解决这个问题?
我不太明白你想要做什么,但我认为这就是你想要的。
import Foundation
protocol MyProtocol {
}
class ClassA : MyProtocol {
}
class ClassB : MyProtocol {
}
final class GenericClass<T:MyProtocol> {
}
func createClass<T:MyProtocol>(_ model: T.Type) -> GenericClass<T> {
let myClass = GenericClass<T>()
return myClass
}
let createdClass = createClass(ClassA.self)
Run Code Online (Sandbox Code Playgroud)