自己在Swift中的struct类型之后

时间:2017-11-13 01:29:22

标签: ios objective-c swift reflection metaclass

我对金属示例中的一行代码感到困惑,其中内存指针绑定到一个类型。

uniforms = UnsafeMutableRawPointer(uniformBuffer.contents()).bindMemory(to: Uniforms.self, capacity: 1)

我的疑惑是.self类型之后的UniformsUniforms是在Objective-C文件中定义的结构,代码不会在调用中没有.self的情况下运行。为什么这有必要?

2 个答案:

答案 0 :(得分:6)

.self返回相应类型的元类型实例。可以将其视为类型安全类型标识符(例如,比使用字符串更安全)。然后,您可以安全地调用此类元类型实例上的可用初始值设定项,静态方法和静态属性。

例如,您也可以将其存储在变量中:

let metatype: Uniforms.Type = Uniforms.self

Uniforms.Type实际的元类型(即类型的类型)。

元节目速成课程。一个非常快速的例子来了解这个元素的实际用途:

class Super {
    let id: Int
    required init(id: Int) { self.id = id }
}

class SubA: Super { ... }
class SubB: Super { ... }

let subclass: Super.Type = SubA.self

然后,稍后,使用subclass创建一个实例,而不用对实际的子类类型名称进行硬编码:

let obj = subclass.init(id: 123) // new SubA instance.

答案 1 :(得分:1)

在Swift中,.self可以在类型上用于提取其元类型或类型的实例。例如,使用.self获取元类型并将其传递给API:

self.tableView.registerClass(
    UITableViewCell.self, forCellReuseIdentifier: "myUIViewCell")