Swift-如何将类型/对象(名称或实例)传递到方法中,然后(a)获取类型(b)实例化它?

Swift-如何将类型/对象(名称或实例)传递到方法中,然后(a)获取类型(b)实例化它?,swift,Swift,我需要这样做,但我有各种各样的问题: class MyClass { } class SomeClass { func callMethod(object) { let theType = object.type // I need the same result as MyClass.self let newInstance = object() // I need the same result as MyClass() } } let someClass = S

我需要这样做,但我有各种各样的问题:

class MyClass {
}

class SomeClass {
  func callMethod(object) {
    let theType = object.type // I need the same result as MyClass.self
    let newInstance = object() // I need the same result as MyClass()
  }
}

let someClass = SomeClass()
let object = MyClass
someClass.callMethod(object)
你是怎么做到的

我希望能够指定一种类型(例如MyClass)。这可以是类型名或其实例,然后获取代码注释中显示的两个值


如果我传入两个单独的变量,会容易得多,但我相信我可以在一个变量中完成。

您可以使用实例的
.dynamicType
属性来获取其类型。然后您可以在其上调用
required
init
方法(或任何其他
/
静态
方法)


注意:此代码根据
对象的类型进行编译。如果类型具有
必需的
init()
方法,则可以安全地调用
dynamicType
。但是,如果类型是
NSObject
,编译器也会允许您在
dynamicType
上调用
init()
,即使考虑到Swift初始值设定项继承的工作方式,子类可能有也可能没有
init()
方法。可以说这是编译器中的一个bug,因此如果您选择这样做,请谨慎使用此代码。感谢@nhgrif对该主题的讨论。

如果“这会容易得多”,为什么不这样做呢。请记住,为了清晰起见,需要编写代码,以便下一个开发人员能够轻松理解。在一年左右的时间里,另一个开发者可能就是你“每个人都知道调试的难度是编写程序的两倍。因此,如果你在编写程序时尽可能聪明,你将如何调试它?”因为我正在学习Swift语言,所以调试更容易。我想学习并正确地完成它,即使它最初需要我更长的时间。从长远来看,学习不好会给你带来问题。你所要求的是不可能的。由于,您无法对通过
dynamicType
属性获得的任何类型都可以使用哪些初始值设定项做出任何假设。Swift中的任何类都不能保证存在默认的零参数构造函数(即使它继承自实现该初始值设定项的超类)。@nhgrif您在一般意义上是正确的。但是,如果将类型应用于NSObject的上面的object参数,代码将编译。但是,它不会编译为AnyObject类型。但是,如果传递的类型没有调用的init方法,则会出现运行时异常。我强烈建议您检查代码。试图实例化这样的对象似乎非常可疑。该对象不一定有
init()
方法。询问者的要求是不可能的。问题中没有指定结果类型,因此我的假设是询问者控制传递给方法的对象。假设他想对它调用init(),大概它有那个初始值设定项。这是一个你无法做出的假设,我假设你的代码甚至不会编译(我现在正在将Xcode下载到一台新机器上,然后我会确认)。Swift中没有任何对象保证具有零参数初始值设定项(即使它继承自一个具有零参数初始值设定项的对象),因此,当我得知您的代码段甚至可以编译时,我会非常惊讶。asker的代码不会编译,因为对象参数没有指定类型,所以这不是一个完全相关的点。如果它是为海报而编写的,那么他的类型就不允许它。它是在我测试它的环境中为我编译的。让我们来看看。
let theType = object.dynamicType
let newInstance = theType.init()