У меня есть проблема с дженериков в Swift (3):Swift Дженерики с Protocol.Type
я получаю различные данные различных классов, реализуя тот же протокол, с сервера, и мне нужно, чтобы поместить их в класс с generics (например, 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
}
...
EDIT
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)
я получаю эту ошибку:
cannot invoke 'createClass' with an argument list of type '(MyProtocol.Type)'
Изменение MyProtocol к классу будет решить эту проблему, но тогда я не мог быть уверен, что каждый класс наследование от него реализует необходимые методы.
Есть ли у кого-то идеи, как решить эту проблему?
Выполняет ли 'func createClass' исправление? –
BallpointBen
Вы могли решить проблему? –
Ну, вы хотите передать 'MyProtocol.self' в функцию, а не' MyProtocol.Type'. Но даже тогда у вас не может быть «MyGenericClass», поскольку «MyProtocol» не является типом, который соответствует «MyProtocol» - см. [Протокол не соответствует самому себе?] (Http://stackoverflow.com/questions/ 33112559/protocol-doesnt-соответствовать-самому себе) –
Hamish