Компилятору необходимо знать тип T
, и в этом случае вы его не указали.
Вы можете сделать это так:
var objects = [GenericObject<YourTypeHere>]()
Например, если GenericObject
будет содержать массив Int
, это будет выглядеть так:
var objects = [GenericObject<Int>]()
Я заметил, что вы обновили свой вопрос .Было бы полезно узнать, чего вы пытаетесь достичь, но я все равно постараюсь вам помочь.
Когда у вас есть универсальный объект, вам нужно сообщить компилятору тип универсального при компиляциивремя, поэтому он жалуется, что тип не может быть выведен, это нужно знать.
Так как вы хотите иметь возможность добавлять объекты в массив GenericManager
, вам нужно, чтобы универсальный в этих двух случаях был одинаковым, поэтому вы можете изменить свой класс следующим образом:
class GenericManager<T> {
var objects = [GenericObject<T>]()
func addObject(_ obj: GenericObject<T>) {
self.objects.append(obj)
}
}
Однако, поскольку объекты должны быть одного и того же универсального типа, вы не можете добавить GenericObject<User>
и GenericObject<Employee>
к одному и тому же менеджеру, что вы можете сделать, это реализовать их как GenericObject<Any>
и выполнитьто же самое с GenericManager
, тогда это будет выглядеть так:
let u = User(name: "User")
let uo = GenericObject(forType: Any.self)
uo.addObject(u)
let e = Employee(name: "Employee", position: "session manager")
let eo = GenericObject(forType: Any.self)
eo.addObject(e)
let manager = GenericManager<Any>()
manager.addObject(uo)
manager.addObject(eo)
Имейте в виду, что это лишит вас любого преимущества, которое могли бы дать дженерики, что вы могли бы сделать - создать протокол или общий суперкласси используйте его вместо Any
, но это зависит от того, чего вы пытаетесь достичь.
Если у вас есть какие-либо дополнительные вопросы, пожалуйста, добавьте комментарий вместо того, чтобы молча обновлять ваш вопрос.