Swift 从元类型获取类型

Swift 从元类型获取类型,swift,types,Swift,Types,我正在努力理解swift 4中类型和元类型之间的区别。我特别希望创建一个数组,如下所示: class A { ... } class B { func doStuff() { let otherType = A.self let itemArr : [otherType] = // Objects of type A } } 这会引发一个编译时错误使用未声明的类型“otherType”,我认为这是因为otherType实际上是a.type。

我正在努力理解swift 4中类型和元类型之间的区别。我特别希望创建一个数组,如下所示:

class A { ... }

class B {

    func doStuff() {
        let otherType = A.self
        let itemArr : [otherType] = // Objects of type A
    }

}
这会引发一个编译时错误
使用未声明的类型“otherType”
,我认为这是因为
otherType
实际上是
a.type
。我认为这可能与泛型有关,但关键是编译时可能不知道类型


有解决这个问题的方法吗?

Swift功能强大,因为您可以将类型作为参数传递,并创建类型的变量。这很有吸引力,但对于您的问题,有更好的解决方案

定义
协议CustomArrayPopulatable{}
并将其添加到可以添加到数组的所有子类/类中。例如,
A1:CustomArrayPopulatable
<代码>A2:customarrayPopulatable


使用泛型类型,可以实现很好的抽象。但是,请记住,如果以后需要强制转换到特定的子类型,则需要自己强制转换,例如:
if type as?A1{…}
,所以请仔细使用泛型,并在开始之前考虑一下,您是否真的需要它们。

这个示例没有真正意义,因为编译器将能够推断
itemArr
的类型,因为您在声明它的同时为它赋值,因此,不需要使用存储在变量中的类型进行类型注释。什么是“您可能希望对对象数组执行的常规操作”?如果此循环中的代码使用这些类型的任何函数/属性,那么它们要么需要是在公共超类中声明的函数/属性,要么需要将数组中的每个对象强制转换为特定的子类。在这两种情况下,您都应该将数组声明为包含任何公共超类。问题是编译器需要在编译时知道变量类型,但(动态)元类型值直到运行时才知道。即使您可以表达
let itemArr:[otherType]
,编译器对
otherType
所知的唯一一件事就是它是继承自(或是)a的类的某个元类型,因此您所表达的与
let itemArr:[a]没有什么不同
@mbamber如果你在问题中写出你描述的“为每个子类创建列表”的循环,这可能会更清楚。正如所问,您的代码与
[A]
(如Hamish所述)相同,因此不清楚您为什么不使用
[A]
。您应该提供一个实际的例子,说明
[A]
不起作用。我怀疑你试图解决的根本问题其实很简单;它之所以变得复杂是因为用元类型来描述它。如果在编译时无法知道类型,您将如何使用该对象?对于未知类型,没有可以调用的方法,那么使用此数组的代码行会是什么样子呢?如果答案是
as?
casting,您可能对问题的思考不正确(不总是,但通常)。您能否更详细地解释一下如何使用此协议来实现我想要的功能?在Swift中移动协议中的公共逻辑被认为是更好的实现。稍后,您可以使用函数的for all clas实现来扩展协议,或者让类自己实现(如果需要)。有了它,您可以创建协议类型的数组,实现公共函数,从而改进抽象,并且您可以在该数组中放置不同类型的对象。请慢慢看,我想这对你会有很大帮助的。快乐编码。