什么是Swift中的ExistentialMetatype

时间:2014-08-16 18:49:43

标签: swift

这让我感到很奇怪。在Swift中尝试以下方法:

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        println(self.superclass) //Outputs "(ExistentialMetatype)"
    }

这使控制台上的输出为 ExistentialMetatype

深入了解Swift的 NSObject 框架,它将此superclass声明为AnyClass类型的只读计算属性

    var superclass: AnyClass! { get }

但是没有提到这个词ExistentialMetatype。我不知道为什么,但它提醒Objective-C的运行时(可能是它中的Metatype一词)。有人知道吗?

2 个答案:

答案 0 :(得分:7)

目前, types 元类型的实例)被打印为无用的内容,例如(Metatype)(ExistentialMetatype)AnyClassAnyObject.Type,是元类型。因此,如果您尝试打印AnyClass,则会得到无用的描述。

然而,Objective-C中的类是具有良好描述的对象。 Swift允许将类类型转换为对象,因此可以以Objective-C方式使用它们。如果先将其转换为AnyObject,您将看到该类的名称:

println(self.superclass as AnyObject!)

答案 1 :(得分:1)

如果我没记错的话,发生的事情是AnyClass是一种特制的协议类型 - 每种"引用类型的协议类型" (类)自动符合

协议类型有时被称为"存在类型"由友好的编译工程师(例如http://www.haskell.org/haskellwiki/Existential_type

在这种情况下,您要查看代表这种存在类型的类型对象,"元类型"正如你所说。因此' ExistentialMetatype'!