【问题标题】:Swift metatype (Type, self)Swift 元类型(类型,自我)
【发布时间】:2016-05-04 06:37:31
【问题描述】:

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

class SomeClass {}

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

clscls2 是同一个东西吗?

有人可以详细说明这些差异吗?谢谢

【问题讨论】:

  • 不,它们不一样:clsSomeClass.Type 类型,而 cls2SomeClass 类型。只需尝试将单个属性添加到您的类,您会注意到您无法从 cls 访问它,而您自然可以从 cls2 访问它。还要注意测试元类型比较时的区别,SomeClass.self === clsSomeClass.self === cls2.dynamicType(两者都是 true)。

标签: swift


【解决方案1】:

元类型类型是指任何类型的类型,包括类类型、结构类型、枚举类型和协议类型。

您可以使用后缀 self 表达式将类型作为值访问。例如,SomeClass.self 返回SomeClass 本身,不是SomeClass 的实例。并且SomeProtocol.self 返回SomeProtocol 本身,而不是在运行时符合SomeProtocol 的类型的实例。您可以将 dynamicType 表达式与类型的实例一起使用,以将该实例的动态运行时类型作为值访问,如下例所示:

class SomeBaseClass {
    class func printClassName() {
        print("SomeBaseClass")
    }
}
class SomeSubClass: SomeBaseClass {
    override class func printClassName() {
        print("SomeSubClass")
    }
}
let someInstance: SomeBaseClass = SomeSubClass()
someInstance.dynamicType.printClassName()
// prints "SomeSubClass"

someInstance的编译时类型为SomeBaseClasssomeInstance 的运行时类型为 SomeSubClass

您可以使用标识运算符(=== 和 !==)来测试实例的运行时类型是否与其编译时类型相同。

if someInstance.dynamicType === SomeBaseClass.self {
    print("The dynamic type of someInstance is SomeBaseCass")
} else {
    print("The dynamic type of someInstance isn't SomeBaseClass")
}

更多细节 -> Swift 编程语言:Types

斯威夫特 3.0:

.dynamicType 已弃用,您应该使用type(of:) 来获取其元类型:

type(of: someInstance).printClassName()

【讨论】:

  • 你是指自我还是自我?如果你们不坚持正确的外壳,很难理解
  • @thibautnoah 以上都是self
【解决方案2】:

不,clscls2 是不同的东西。理解差异的最简单方法是像这样扩展您的示例:

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() 调用SomeClassinit() 方法,这是一个创建SomeClass 实例的构造函数。

专业提示

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

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

【讨论】:

  • 很好的解释!特别是关于单身人士(不知道)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多