一尘不染

Swift元类型(类型,自我)

swift

我试图了解:“ self, dynamicType, Type”。我有这个代码:

class SomeClass {}

let cls : SomeClass.Type = SomeClass.self
let cls2 : SomeClass = SomeClass()

clscls2同一件事吗?

有人可以提供一些有关差异的细节吗?谢谢


阅读 257

收藏
2020-07-07

共1个答案

一尘不染

没有,cls并且cls2是不同的东西。理解差异的最简单方法是像这样扩展您的示例:

class SomeClass {
    class func doIt() {
        print("I'm a class method. I belong to my type.")
    }

    func doItOnlyIfInstanceOfThisType() {
        print("I'm a instance method. I belong to my type instance.")
    }
}

现在让您开始cls

let cls : SomeClass.Type = SomeClass.self
cls.doIt()

那将打印I'm a class method. I belong to my type.。但是您不能调用此:

cls.doItOnlyIfInstanceOfThisType() // causes a compilation error, PRO TIP: actually you can use this method as a func property, but I'll add the explanation for this later

让我们来吧cls2。它唯一可见的方法是doItOnlyIfInstanceOfThisType因为它是一个实例方法(这种类型)。

let cls2 : SomeClass = SomeClass()
cls2.doItOnlyIfInstanceOfThisType()

因此,它们之间的区别在于这cls是一个类型,并且cls2是该类型的实例。

有关为何SomeClass.self和SomeClass()的更多知识?

类的类型也存在于内存中(例如,它具有自己的方法),作为表示Type的单例(不是该类型的实例-
有所不同)。如果调用self这样的Type,SomeClass.self您将获得一个表示SomeClassType 的单例实例。

SomeClass()调用的init()方法,该方法SomeClass创建一个的实例的构造函数SomeClass

专家提示

您可以操纵Type实例函数(例如ObjC中的闭包/块)。这是一个生成的类方法。但是您必须将采用此方法的类型的实例作为参数传递,如下所示:

let myFunc :()->() = cls.doItOnlyIfInstanceOfThisType(cls2)
myFunc()
2020-07-07