.self 在 Swift 中的结构类型之后
Posted
技术标签:
【中文标题】.self 在 Swift 中的结构类型之后【英文标题】:.self after struct type in Swift 【发布时间】:2018-04-25 15:18:59 【问题描述】:我对 Metal 示例中的一行代码感到困惑,其中内存指针绑定到一个类型。
uniforms = UnsafeMutableRawPointer(uniformBuffer.contents()).bindMemory(to: Uniforms.self, capacity: 1)
我的困惑是Uniforms
类型之后的.self
。 Uniforms
是在 Objective-C 文件中定义的结构,如果没有 .self
在调用中,代码将无法运行。为什么有必要?
【问题讨论】:
【参考方案1】:.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.
【讨论】:
【参考方案2】:在 Swift 中,.self 可用于类型以提取其元类型或类型的实例。例如,使用 .self 获取元类型并将其传递给 API:
self.tableView.registerClass(
UITableViewCell.self, forCellReuseIdentifier: "myUIViewCell")
【讨论】:
以上是关于.self 在 Swift 中的结构类型之后的主要内容,如果未能解决你的问题,请参考以下文章
swift 在swift via option中使用结构中的多个类型