У меня есть следующий код Swift. Моя цель - иметь возможность передать тип или класс FirstItem или SecondItem в Manager, чтобы иметь возможность создавать экземпляры позже (путем вызова функции createItem).
protocol CustomItem {
static func instantiate() -> CustomItem
}
class FirstItem: CustomItem {
static func instantiate() -> CustomItem {
return FirstItem()
}
}
class SecondItem: CustomItem {
static func instantiate() -> CustomItem {
return SecondItem()
}
}
class Manager {
var itemClass: CustomItem
func createItem() {
let itemInstance = itemClass.instantiate()
}
init(itemClass: CustomItem) {
self.itemClass = itemClass
}
}
let manager = Manager(itemClass: FirstItem)
Как я могу исправить приведенный выше код, чтобы учесть это, чтобы менеджер принимал сам класс вместо экземпляра класса.
@ Александр: Достаточно честно. Но на самом деле дело не в функции создания экземпляра. И я предполагаю, что есть ситуации, когда эта функция может быть более сложной.
Я знаю, почему это был комментарий, а не ответ. Кроме того, в зависимости от ваших потребностей (о которых я ничего не знаю), возможно, стоит подумать о закрытии "CustomItemGenerator" (типа (SomeInput1, SomeInput2, ...) -> CustomItem).





Изменяя тип параметра, который вы принимаете в функции init, на CustomItem.Type и изменяя значение, которое вы передаете в FirstItem.self, это работает. Например, изменение кода на что-то вроде следующего должно сработать.
protocol CustomItem {
static func instantiate() -> CustomItem
}
class FirstItem: CustomItem {
static func instantiate() -> CustomItem {
return FirstItem()
}
}
class SecondItem: CustomItem {
static func instantiate() -> CustomItem {
return SecondItem()
}
}
class Manager {
var itemClass: CustomItem.Type
func createItem() {
let itemInstance = itemClass.instantiate()
}
init(itemClass: CustomItem.Type) {
self.itemClass = itemClass
}
}
let manager = Manager(itemClass: FirstItem.self)
instantiateбесполезен. Просто сделайте инициализатор частью протокола.