Reflection 如何在Swift 3中传递类型(of:…)的结果?

Reflection 如何在Swift 3中传递类型(of:…)的结果?,reflection,swift3,Reflection,Swift3,考虑以下代码: var med: Med = Med() var cls1 = type(of:med) var cls2 = Med.self var cls3: AnyClass = Med.self var med1 = cls1.init() var med2 = cls2.init() var med3 = cls3.init() // Compiler: 'init' is a member of the type; use 'type(of: ...)' to initiali

考虑以下代码:

var med: Med = Med()

var cls1 = type(of:med)
var cls2 = Med.self
var cls3: AnyClass = Med.self

var med1 = cls1.init()
var med2 = cls2.init()
var med3 = cls3.init() // Compiler: 'init' is a member of the type; use 'type(of: ...)' to initialize a new object of the same dynamic type
这样做的方式似乎在每个版本的Swift之间都发生了很大的变化,因此在线搜索提供了很多死胡同

如果Med.self不是AnyClass类型,那么当我设置cls3时,编译器为什么不抱怨呢?如果是AnyClass类型,为什么设置med3时会抱怨?如何将类型(of:…)的结果传递给另一个方法以使用它


或者简单地说,如何在Swift 3中获得任何类的新实例?

编译器无法知道存储在
cls3
中的类型具有
init()
方法。比较,例如,或。@MartinR是的,我一直在看那个评论。它似乎将其转换为NSObject。Type允许我获得我需要的,但感觉有点不满足。您可以将其转换为具体类型或协议类型,如第二个链接中的协议类型,协议需要init方法。@MartinR我明白了;ya:[var med3=(cls3as!NSObject.Type).init()]正在工作。在这种情况下,我知道所有相关的对象都将从Domain下降到Domain。Type也可以工作(包括一个必需的init()),编译器不能知道
cls3
中存储的类型有一个
init()
方法。比较,例如,或。@MartinR是的,我一直在看那个评论。它似乎将其转换为NSObject。Type允许我获得我需要的,但感觉有点不满足。您可以将其转换为具体类型或协议类型,如第二个链接中的协议类型,协议需要init方法。@MartinR我明白了;ya:[var med3=(cls3as!NSObject.Type).init()]正在工作。在这种情况下,我知道所有相关的对象都将从Domain下降到Domain.Type(包括一个必需的init())