Создание экземпляров классов из массива метатипов - PullRequest
0 голосов
/ 18 декабря 2018

Предположим, у меня есть протокол TestProtocol и классы TestClass1 и TestClass2, соответствующие TestProtocol:

protocol TestProtocol: AnyObject { }
class TestClass1: TestProtocol { }
class TestClass2: TestProtocol { }

Предположим, что у меня есть массив метатипов, определенный как

var testArray: [TestProtocol.Type] = [TestClass1.self, TestClass2.self]

Как я могу создавать объекты экземпляров TestClass1 и TestClass2 на основе записей testArray?

ps: Это должно быть сделано без создания конструкции switch, которая проверяет повторTestClass1.self и TestClass2.self как

var instanceArray: [TestProtocol] = []
for element in testArray {
    if element == TestClass1.self {
        instanceArray.append(TestClass1())
    } else if element == TestClass2.self {
        instanceArray.append(TestClass2())
    }
}

Я посмотрел на дженерики, но не нашел подходящего решения, потому что метатипы хранятся в массиве типа [TestProtocol.Type].

1 Ответ

0 голосов
/ 18 декабря 2018

Это работает:

protocol TestProtocol: AnyObject {
    init()
}

final class TestClass1: TestProtocol { }
final class TestClass2: TestProtocol { }

var testArray: [TestProtocol.Type] = [TestClass1.self, TestClass2.self]

for testType in testArray {
    let testInstance = testType.init()
}

final classes также может быть structs (но вам нужно снять ограничение AnyObject)

Можете ли вы сообщить мне, еслиэто компилирует для вас?Если нет, вам нужно обновить ваш набор инструментов.

...