从元类型数组创建 class 个实例
Create class instances from an array of metatypes
假设我确实有一个协议 TestProtocol
和 类 TestClass1
和 TestClass2
符合 TestProtocol
:
protocol TestProtocol: AnyObject { }
class TestClass1: TestProtocol { }
class TestClass2: TestProtocol { }
进一步假设我有一个定义为
的元类型数组
var testArray: [TestProtocol.Type] = [TestClass1.self, TestClass2.self]
如何根据 testArray
的条目创建 TestClass1
和 TestClass2
的实例对象?
p.s.: 这应该在不创建再次检查 TestClass1.self
和 TestClass2.self
like
的开关构造的情况下完成
var instanceArray: [TestProtocol] = []
for element in testArray {
if element == TestClass1.self {
instanceArray.append(TestClass1())
} else if element == TestClass2.self {
instanceArray.append(TestClass2())
}
}
我研究了泛型,但没有找到合适的解决方案,因为元类型存储在 [TestProtocol.Type]
.
类型的数组中
这个有效:
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
约束)
你能告诉我它是否为你编译了吗?如果没有,您需要更新您的工具链。
假设我确实有一个协议 TestProtocol
和 类 TestClass1
和 TestClass2
符合 TestProtocol
:
protocol TestProtocol: AnyObject { }
class TestClass1: TestProtocol { }
class TestClass2: TestProtocol { }
进一步假设我有一个定义为
的元类型数组var testArray: [TestProtocol.Type] = [TestClass1.self, TestClass2.self]
如何根据 testArray
的条目创建 TestClass1
和 TestClass2
的实例对象?
p.s.: 这应该在不创建再次检查 TestClass1.self
和 TestClass2.self
like
var instanceArray: [TestProtocol] = []
for element in testArray {
if element == TestClass1.self {
instanceArray.append(TestClass1())
} else if element == TestClass2.self {
instanceArray.append(TestClass2())
}
}
我研究了泛型,但没有找到合适的解决方案,因为元类型存储在 [TestProtocol.Type]
.
这个有效:
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
约束)
你能告诉我它是否为你编译了吗?如果没有,您需要更新您的工具链。