不,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() 的知识?
类的类型也存在于内存中(例如,它有自己的方法),作为表示类型的单例(不是这种类型的实例 - 这是不同的东西)。
如果你在像 SomeClass.self 这样的类型上调用 self,你将得到一个代表 SomeClass 类型的单例实例。
SomeClass() 调用SomeClass 的init() 方法,这是一个创建SomeClass 实例的构造函数。
专业提示
您可以操作 Type 实例函数(如 ObjC 中的闭包/块)。这是一个生成的类方法。但是您必须传递您从中获取此方法的类型的实例作为参数,如下所示:
let myFunc :()->() = cls.doItOnlyIfInstanceOfThisType(cls2)
myFunc()