我试图理解为什么我无法在Swift中使用镜像创建类的实例。在操场上,一切似乎都很好,直到下面的最后一行代码。
所以,这是第一个使用type(of:)的例子:
// First Example
var s = String( "Foo" ) // Playground Output: Foo
type(of: s) // Playground Output: String.Type
var typeClone = type( of: s ).init() // Playground Output: "" (as expected)
一切都按预期工作。现在,当我试图在镜子物体中找到一个孩子的同样的事情时,游乐场抱怨道:
// Second Example
class FooContainer {
var s : String = "Foo"
}
var t = FooContainer()
var tMirror = Mirror( reflecting: t ) // Output: Mirror for FooContainer
tMirror.children.first! // Output: {some "s"}, value "Foo")
type( of: tMirror.children.first!.value ) // Output: String.Type
var typeClone2 = type( of: tMirror.children.first!.value ).init()
带有“typeClone2”的行是失败的行。如果我分解表达式并检查事物,似乎所有类型和值都是相似的,如第一个示例中所示。但在第二种情况下,操场发出此错误:
游乐场执行失败:
错误:输入Playground.playground:12:18:错误:'init'是>类型的成员;使用'type(of:...)'来初始化相同动态>类型的新对象 var typeClone2 = type(of:tMirror.children.first!.value).init() ^ type(of :)
我需要做些什么来完成这项工作?提前谢谢!
答案 0 :(得分:0)
您的代码无法正常工作,但您收到的错误是错误的,因此您应该忽略它。
真正的问题是你不能盲目地调用init()
类型的Any
。有很多类型根本没有init()
。它在第一个示例中适用于type(of: s)
,因为编译器在编译时知道类型为String
(并且String
具有init()
)。但如果你将它包装在Any
中,那么它也会失败:
let s = String("Foo") as Any
let typeClone = type(of: s).init()
不幸的是,这意味着没有办法做你想做的事。